Sobes.tech
Middle

Qaysi turdagi proksi-serverlarni bilasiz?

sobes.tech AI

AIdan javob

Java-da quyidagi proksi turlari mavjud:

  • Statik (Static Proxy): Bu alohida qilingan wrapper sinfi yordamida amalga oshiriladi, u haqiqiy ob'ektga havola qiladi va unga metod chaqiruvlarini delegat qiladi, bunda o'z logikasini qo'shadi (masalan, log yozish, autentifikatsiya).

    // Interfeys
    interface Service {
        void doSomething();
    }
    
    // Haqiqiy ob'ekt
    class RealService implements Service {
        @Override
        public void doSomething() {
            System.out.println("Haqiqiy harakat");
        }
    }
    
    // Statik proksi
    class StaticServiceProxy implements Service {
        private final Service realService;
    
        public StaticServiceProxy(Service realService) {
            this.realService = realService;
        }
    
        @Override
        public void doSomething() {
            System.out.println("Haqiqiy metod chaqirilishidan oldin");
            realService.doSomething();
            System.out.println("Haqiqiy metod chaqirilishidan keyin");
        }
    }
    
  • Dinamik (Dynamic Proxy): Bu Reflection API yordamida bajariladigan va proksi ob'ekti kamida bitta interfeysni amalga oshirishi shart bo'lgan vaqtda yaratiladi. Bir xil interfeysni amalga oshiradigan ko'plab sinflar uchun proksi yaratishga imkon beradi, har bir uchun alohida sinf yaratmasdan.

    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    // Dinamik proksi uchun chaqiruvlarni ishlovchi
    class DynamicServiceInvocationHandler implements InvocationHandler {
        private final Object target; // Maqsad ob'ekt
    
        public DynamicServiceInvocationHandler(Object target) {
            this.target = target;
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("Metod chaqirilishidan oldin " + method.getName());
            Object result = method.invoke(target, args); // Maqsad ob'ektining metodini chaqirish
            System.out.println("Metod chaqirilishidan keyin " + method.getName());
            return result;
        }
    }
    
    // Foydalanish misoli (Statik proksi uchun Service interfeysi)
    // Service realService = new RealService();
    // Service proxy = (Service) Proxy.newProxyInstance(
    //     realService.getClass().getClassLoader(),
    //     realService.getClass().getInterfaces(),
    //     new DynamicServiceInvocationHandler(realService));
    // proxy.doSomething();
    
  • CGLIB Proxy: Bytecode generatsiya qilishga asoslangan va interfeysni amalga oshirmasdan ishlaydi. Maxsus sinflarni proksi qilish mumkin (agar ular final bo'lmasa va metodlar final bo'lmasa). Ba'zi holatlarda standart dinamik proksi bilan solishtirganda yuqori samaradorlikka ega.

    // CGLIB dan foydalanish misoli (tashqi kutubxonani talab qiladi)
    // public class RealService {
    //     public void doSomething() {
    //         System.out.println("Haqiqiy harakat");
    //     }
    // }
    
    // 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 chaqirilishidan oldin " + method.getName());
    //         Object result = proxy.invokeSuper(obj, args); // Asosiy sinf metodini chaqirish
    //         System.out.println("Metod chaqirilishidan keyin " + method.getName());
    //         return result;
    //     }
    // }
    
    // // Foydalanish misoli:
    // // Enhancer enhancer = new Enhancer();
    // // enhancer.setSuperclass(RealService.class);
    // // enhancer.setCallback(new CglibServiceInterceptor());
    // // RealService proxy = (RealService) enhancer.create();
    // // proxy.doSomething();
    

Asosiy farqlar:

Proksi turi Interfeys talab qiladimi Yaratish usuli Moslashuvchanlik Samaradorlik Qo'llanilishi
Statik Ha Qo'lda Past (har bir sinf uchun) Yuqori Oddiy holatlar, struktura ma'lum bo'lsa
Dinamik Ha Ish vaqtida Yuqori (interfeyslar uchun) O'rtacha Umumiy logika, AOP uchun
CGLIB Yo'q Ish vaqtida Yuqori (sinf uchun) Yuqori AOP, interfeys bo'lmagan sinflar uchun