Sobes.tech
Middle

Kādus starpniekserveru tipus jūs zināt?

sobes.tech AI

Atbilde no AI

Java ir pastāv šādas proxy veidi:

  • Statiskais (Static Proxy): Tiek ar izveido atsevišķu apvalka klasi, kas satur atsauci uz reālo objektu un deleģē tam metožu izsaukšanu, pievienojot savu loģiku (piemēram, žurnālu, autorizāciju).

    // Saites
    interface Service {
        void doSomething();
    }
    
    // Reālais objekts
    class RealService implements Service {
        @Override
        public void doSomething() {
            System.out.println("Reāla darbība");
        }
    }
    
    // Statiskais proxy
    class StaticServiceProxy implements Service {
        private final Service realService;
    
        public StaticServiceProxy(Service realService) {
            this.realService = realService;
        }
    
        @Override
        public void doSomething() {
            System.out.println("Pirms reālas metodes izsaukšanas");
            realService.doSomething();
            System.out.println("Pēc reālas metodes izsaukšanas");
        }
    }
    
  • Dinamisks (Dynamic Proxy): Izveidojas izpildes laikā, izmantojot Reflection API, un prasa, lai proxy objekts realizētu vismaz vienu saskarni. Ļauj ģenerēt proxy daudzām klases, kas realizē vienu saskarni, bez atsevišķas klases katram.

    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    // Apstrādātājs dinamiskiem proxy
    class DynamicServiceInvocationHandler implements InvocationHandler {
        private final Object target; // Mērķa objekts
    
        public DynamicServiceInvocationHandler(Object target) {
            this.target = target;
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("Pirms metodes izsaukšanas " + method.getName());
            Object result = method.invoke(target, args); // Mērķa objekta metodes izsaukšana
            System.out.println("Pēc metodes izsaukšanas " + method.getName());
            return result;
        }
    }
    
    // Piemērs izmantošanai (saskaņā ar statiskā proxy piemēru ar Service saskarni)
    // Service realService = new RealService();
    // Service proxy = (Service) Proxy.newProxyInstance(
    //     realService.getClass().getClassLoader(),
    //     realService.getClass().getInterfaces(),
    //     new DynamicServiceInvocationHandler(realService));
    // proxy.doSomething();
    
  • CGLIB Proxy: Balstīts uz baitkoda ģenerēšanu un neprasa realizēt saskarni. Var proxy konkrētas klases (ja tās nav finalas un metodes nav finalas). Dažos scenārijos ir efektīvāks nekā standarta dinamisks proxy.

    // Piemērs ar CGLIB (prasa trešās puses bibliotēku)
    // public class RealService {
    //     public void doSomething() {
    //         System.out.println("Reāla darbība");
    //     }
    // }
    
    // 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("Pirms metodes izsaukšanas " + method.getName());
    //         Object result = proxy.invokeSuper(obj, args); // Superklases metode (oriģinālais objekts)
    //         System.out.println("Pēc metodes izsaukšanas " + method.getName());
    //         return result;
    //     }
    // }
    
    // // Piemērs ar izmantošanu:
    // // Enhancer enhancer = new Enhancer();
    // // enhancer.setSuperclass(RealService.class);
    // // enhancer.setCallback(new CglibServiceInterceptor());
    // // RealService proxy = (RealService) enhancer.create();
    // // proxy.doSomething();
    

Galvenās atšķirības:

Proxy veids Prasa saskarni Ģenerēšana Elastība Veiktspēja Pielietojums
Statiskais Rūpīgi Zema (katram klases gadījumam) Augsta Vienkārši gadījumi, kad struktūra ir zināma
Dinamisks Izpildes laikā Augsta (saskarnēm) Vidēja Vispārīga loģika saskarnēm, AOP
CGLIB Izpildes laikā Augsta (klasēm) Augsta AOP, proxy klases bez saskarnēm