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 | Jā | Rūpīgi | Zema (katram klases gadījumam) | Augsta | Vienkārši gadījumi, kad struktūra ir zināma |
| Dinamisks | Jā | Izpildes laikā | Augsta (saskarnēm) | Vidēja | Vispārīga loģika saskarnēm, AOP |
| CGLIB | Nē | Izpildes laikā | Augsta (klasēm) | Augsta | AOP, proxy klases bez saskarnēm |