Sobes.tech
Middle

Hansı növ proxy serverlərini bilirsiniz?

sobes.tech Süni İntellekt

AI-dan cavab

Java-da aşağıdakı proxy növləri mövcuddur:

  • Statik Proxy (Static Proxy): Bu, xüsusi bir wrapper sinfi yaradaraq həyata keçirilir, bu sinif real obyektə istinad edir və metod çağırışlarını ona yönəldir, öz logikasını əlavə edir (məsələn, qeydiyyat, autentifikasiya).

    // İnterfeys
    interface Service {
        void doSomething();
    }
    
    // Əsl obyekt
    class RealService implements Service {
        @Override
        public void doSomething() {
            System.out.println("Əsl fəaliyyət");
        }
    }
    
    // Statik proxy
    class StaticServiceProxy implements Service {
        private final Service realService;
    
        public StaticServiceProxy(Service realService) {
            this.realService = realService;
        }
    
        @Override
        public void doSomething() {
            System.out.println("Əsl metod çağırışından əvvəl");
            realService.doSomething();
            System.out.println("Əsl metod çağırışından sonra");
        }
    }
    
  • Dinamik Proxy (Dynamic Proxy): Bu, Reflection API istifadə edilərək işləmə zamanı yaradılır və proxy olunmuş obyektin ən azı bir interfeys həyata keçirməsini tələb edir. Bu, bir interfeys həyata keçirən çox sinf üçün proxy yaratmağa imkan verir, hər biri üçün ayrıca sinf yaratmadan.

    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    // Çağırışlar üçün işləyici
    class DynamicServiceInvocationHandler implements InvocationHandler {
        private final Object target; // Hədəf obyekt
    
        public DynamicServiceInvocationHandler(Object target) {
            this.target = target;
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("Metod çağırışından əvvəl " + method.getName());
            Object result = method.invoke(target, args); // Hədəf obyektin metodunu çağırır
            System.out.println("Metod çağırışından sonra " + method.getName());
            return result;
        }
    }
    
    // İstifadə nümunəsi (Statik proxy nümunəsindən Service interfeysi üçün)
    // Service realService = new RealService();
    // Service proxy = (Service) Proxy.newProxyInstance(
    //     realService.getClass().getClassLoader(),
    //     realService.getClass().getInterfaces(),
    //     new DynamicServiceInvocationHandler(realService));
    // proxy.doSomething();
    
  • CGLIB Proxy: Bytecode generasiyasına əsaslanır və interfeys həyata keçirməyi tələb etmir. Konkret sinfləri proxy edə bilər (əgər onlar final deyilsə və metodlar final deyilsə). Bəzi ssenarilərdə standart dinamik proxy-dən daha məhsuldardır.

    // CGLIB istifadə nümunəsi (xarici kitabxana tələb edir)
    // public class RealService {
    //     public void doSomething() {
    //         System.out.println("Əsl fəaliyyət");
    //     }
    // }
    
    // import net.sf.cglib.proxy.MethodInterceptor;
    // import net.sf.cglib.proxy.MethodProxy;
    // import net.sf.cglib.proxy.Enhancer;
    
    // class CglibServiceInterceptor implements MethodInterceptor {
    //     @Override
    //     public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
    //         System.out.println("Metod çağırışından əvvəl " + method.getName());
    //         Object result = proxy.invokeSuper(obj, args); // Orijinal obyektin metodunu çağırır
    //         System.out.println("Metod çağırışından sonra " + method.getName());
    //         return result;
    //     }
    // }
    
    // // İstifadə nümunəsi:
    // // Enhancer enhancer = new Enhancer();
    // // enhancer.setSuperclass(RealService.class);
    // // enhancer.setCallback(new CglibServiceInterceptor());
    // // RealService proxy = (RealService) enhancer.create();
    // // proxy.doSomething();
    

Əsas fərqlər:

Proxy Növü İnterfeys tələb edir Yaratma üsulu Elastiklik Performans Tətbiq sahəsi
Statik Bəli Əl ilə Aşağı (hər sinf üçün) Yüksək Sadə hallar, struktur məlum olduqda
Dinamik Bəli İş vaxtında Yüksək (interfeyslər üçün) Orta Ümumi loqika, AOP üçün
CGLIB Xeyr İş vaxtında Yüksək (sinflər üçün) Yüksək AOP, interfeys olmayan sinflər üçün