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 |