რომელი ტიპის პროქსის სერვერები იცით?
sobes.tech AI
პასუხი AI-სგან
Java-да төмөнкү түрлөрү бар:
-
Статикалык (Static Proxy): Бул өзүнчө класс-обертка түзүү аркылуу ишке ашырылат, ал реалдуу объектке шилтемени камтыйт жана анын методдорун чакырат, өзүнүн логикасын кошуп (мисалы, логгинг, авторизация).
// Интерфейс interface Service { void doSomething(); } // Реалдуу объект class RealService implements Service { @Override public void doSomething() { System.out.println("Реалдуу аракет"); } } // Статикалык прокси class StaticServiceProxy implements Service { private final Service realService; public StaticServiceProxy(Service realService) { this.realService = realService; } @Override public void doSomething() { System.out.println("Реалдуу методду чакырганга чейин"); realService.doSomething(); System.out.println("Реалдуу методду чакыргандан кийин"); } } -
Динамикалык (Dynamic Proxy): Аткаруу учурунда түзүлөт, Reflection API колдонуп жана прокси объект кеминде бир интерфейсти ишке ашырган болушу керек. Бир интерфейсти ишке ашырган көптөгөн класстар үчүн прокси түзүүгө мүмкүндүк берет, ар бир үчүн өзүнчө класс түзбөстөн.
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; // Dynamic Proxy үчүн иштетүүчү class DynamicServiceInvocationHandler implements InvocationHandler { private final Object target; // Мақсаттуу объект public DynamicServiceInvocationHandler(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("Методду чакырганга чейин " + method.getName()); Object result = method.invoke(target, args); // Мақсаттуу объекттин методун чакыруу System.out.println("Методду чакыргандан кийин " + method.getName()); return result; } } // Колдонуу мисалы (Service интерфейси үчүн) // Service realService = new RealService(); // Service proxy = (Service) Proxy.newProxyInstance( // realService.getClass().getClassLoader(), // realService.getClass().getInterfaces(), // new DynamicServiceInvocationHandler(realService)); // proxy.doSomething(); -
CGLIB Proxy: Байткод түзүү негизделген жана интерфейсти ишке ашыруусун талап кылбайт. Конкреттүү класстарды прокси кылышы мүмкүн (эгер алар финалдык эмес жана методдору финалдык эмес болсо). Айрым сценарийлерде стандарттык динамикалык проксиге караганда натыйжалуу.
// CGLIB колдонуу мисалы (сырткы китепкана талап кылынат) // public class RealService { // public void doSomething() { // System.out.println("Реалдуу аракет"); // } // } // 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("Преди извикването на метода " + method.getName()); // Object result = proxy.invokeSuper(obj, args); // Вика метода на суперкласа (оригиналния обект) // System.out.println("После извикването на метода " + method.getName()); // return result; // } // } // // Пример за използване: // // Enhancer enhancer = new Enhancer(); // // enhancer.setSuperclass(RealService.class); // // enhancer.setCallback(new CglibServiceInterceptor()); // // RealService proxy = (RealService) enhancer.create(); // // proxy.doSomething();
Големите разлики:
| Вид прокси | Изисква Интерфейс | Генериране | Гъвкавост | Производителност | Приложение |
|---|---|---|---|---|---|
| Статичен | Да | Вручную | Ниска (за всеки клас) | Висока | Простите случаи, когато структурата е известна |
| Динамичен | Да | Во време на изпълнение | Висока (за интерфейси) | Средна | Общи логика за интерфейси, АОП |
| CGLIB | Не | Во време на изпълнение | Висока (за класове) | Висока | АОП, проксиране на класове без интерфейси |