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 |