Sobes.tech
Middle

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