Hangi tür proxy sunucuları biliyorsunuz?
sobes.tech yapay zeka
AI'dan gelen yanıt
Java'da aşağıdaki proxy türleri vardır:
-
Statik (Static Proxy): Ayrı bir sarmalayıcı sınıf oluşturarak uygulanır, bu sınıf gerçek nesneye referans içerir ve metod çağrılarını ona devreder, kendi mantığını (örneğin, günlük kaydı, yetkilendirme) ekler.
// Arayüz interface Service { void doSomething(); } // Gerçek nesne class RealService implements Service { @Override public void doSomething() { System.out.println("Gerçek işlem"); } } // Statik proxy class StaticServiceProxy implements Service { private final Service realService; public StaticServiceProxy(Service realService) { this.realService = realService; } @Override public void doSomething() { System.out.println("Gerçek metodu çağırmadan önce"); realService.doSomething(); System.out.println("Gerçek metodu çağırdıktan sonra"); } } -
Dinamik Proxy (Dynamic Proxy): Çalışma zamanında Reflection API kullanılarak oluşturulur ve proxy nesnesinin en az bir arayüzü uygulaması gerekir. Bir arayüzü uygulayan çoklu sınıflar için proxy oluşturmayı sağlar, her biri için ayrı sınıf oluşturmaya gerek kalmaz.
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; // Dinamik proxy çağrı işleyicisi class DynamicServiceInvocationHandler implements InvocationHandler { private final Object target; // Hedef nesne 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ısından önce " + method.getName()); Object result = method.invoke(target, args); // Hedef nesnenin metodunu çağır System.out.println("Metod çağrısından sonra " + method.getName()); return result; } } // Kullanım örneği (Statik proxy'den Service arayüzü için) // Service realService = new RealService(); // Service proxy = (Service) Proxy.newProxyInstance( // realService.getClass().getClassLoader(), // realService.getClass().getInterfaces(), // new DynamicServiceInvocationHandler(realService)); // proxy.doSomething(); -
CGLIB Proxy: Bytecode üretimine dayanır ve arayüz uygulaması gerekmez. Belirli sınıfları proxyleyebilir (eğer final değilse ve metodlar final değilse). Bazı senaryolarda standart dinamik proxy'den daha performanslıdır.
// CGLIB kullanımı örneği (üçüncü taraf kütüphane gerektirir) // public class RealService { // public void doSomething() { // System.out.println("Gerçek işlem"); // } // } // 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ısından önce " + method.getName()); // Object result = proxy.invokeSuper(obj, args); // Süper sınıf metodunu çağır // System.out.println("Metod çağrısından sonra " + method.getName()); // return result; // } // } // // Kullanım örneği: // // Enhancer enhancer = new Enhancer(); // // enhancer.setSuperclass(RealService.class); // // enhancer.setCallback(new CglibServiceInterceptor()); // // RealService proxy = (RealService) enhancer.create(); // // proxy.doSomething();
Ana farklar:
| Proxy Türü | Arayüz Gerektirir | Oluşum | Esneklik | Performans | Kullanım |
|---|---|---|---|---|---|
| Statik | Evet | Elle | Düşük (her sınıf için) | Yüksek | Basit durumlar, yapı biliniyor |
| Dinamik | Evet | Çalışma zamanında | Yüksek (arayüzler için) | Orta | Ortak mantık, AOP |
| CGLIB | Hayır | Çalışma zamanında | Yüksek (sınıflar için) | Yüksek | AOP, arayüz olmayan sınıflar için proxy |