Реализация динамического прокси -сервера
Используется режим: прокси -режим.
Функция прокси -режима состоит в том, чтобы предоставить прокси для других объектов для управления доступом к этому объекту. Подобно арендованному агентству.
Два динамического прокси:
(1) Динамический прокси JDK. Динамический прокси JDK реализован механизмом отражения внутри Java. Целевой класс основан на унифицированном интерфейсе (InvocationHandler)
(2) Динамический прокси -сервер CGLIB и базовый уровень динамического прокси CGLIB реализуется с помощью ASM. Динамический прокси, реализованный сторонней библиотекой, такой как CGLIB, более широко используется и имеет больше преимуществ в эффективности.
Основная структура приложения:
AOP весной, перехватчик в Struts2
Конкретная реализация:
1. Определите интерфейсы и реализуйте классы
пакет com.example.service; public interface userservice {public String getName (int id); public integer getage (int id);} пакет com.example.service.impl; import com.example.service.userservice; открытый класс пользователи urserviceimpl реализует userservice {public String getName (int id) {System.out.println ("------ getName -----"); вернуть "кошка"; } public integer getage (int id) {System.out.println ("------ getage -----"); возврат 10; }}2. Реализация динамического прокси JDK
пакет com.example.jdk; импорт java.lang.reflect.invocationHandler; импортировать java.lang.reflect.method; импортировать java.lang.reflect.proxy; public class myinvocation handler реализует upocationhandler {частное объект цели; / ** * Приведите объект делегата и верните класс прокси * * @param target * @return */ public объект Bind (объект цели) {this.target = target; // Получить объект Proxy return Proxy.newProxyInstance (target.getClass (). GetClassloader (), target.getClass (). GetInterfaces (), это); // Связывать интерфейс (это дефект, CGLIB составляет этот дефект)} @Override Public Object Invoke (Proxy Object, метод метода, объект [] args) бросает Throwable {if ("getName" .Equals (method.getName ())) {System.out.println ("----- до" + method.getname () + "---); Object result = method.invoke (target, args); System.out.println ("------ после" + method.getName () + "------"); результат возврата; } else {object result = method.invoke (target, args); результат возврата; }}} пакет com.example.jdk; import com.example.service.userservice; import com.example.service.impl.userserviceimpl;/*** Тестовый класс*/открытый класс runjdk {public static void main (string [] args) {myinvocation houndler = new myinvocation woid (); Userservice userserviceproxy = (userservice) proxy.bind (new userserviceimpl ()); System.out.println (userserviceproxy.getName (1)); System.out.println (userserviceproxy.getage (1)); }}Результаты работы:
------ перед GetName ----
------ GetName -----
------ после GetName -----
кот
----- Getage -----
10
3. Реализация динамического прокси -сервера CGLIB:
Динамический прокси -механизм JDK может прокси может только прокси, которые реализуют интерфейсы, но классы, которые не могут реализовать интерфейсы, не могут реализовать динамический прокси JDK. CGLIB реализует прокси для занятий. Его принцип состоит в том, чтобы генерировать подкласс для указанного целевого класса и перезаписать улучшение реализации метода. Однако, поскольку используется наследование, класс, модифицированный финалом, не может быть доверен.
Основные классы Cglib:
net.sf.cglib.proxy.enhancer Основной класс улучшения
net.sf.cglib.proxy.methodinterceptor Основной метод перехватывает класс, который является поднтерфейсом интерфейса обратного вызова и требует реализации пользователя.
net.sf.cglib.proxy.methodproxy класс прокси в java.lang.reflect.method класс JDK может легко реализовать вызовы для методов исходного объекта.
Интерфейс net.sf.cglib.proxy.methodinterceptor является наиболее общим типом обратного вызова, и он часто используется AOP на основе прокси для реализации вызовов метода перехвата. Этот интерфейс определяет только один метод
Public Object Intercept (объект объекта, java.lang.reflect.method метод,
Object [] Args, MethodProxy Proxy) бросает бросок;
Первым параметром является прокси -объект, а второй и третий параметры - это перехваченный метод и параметры метода, соответственно. Первоначальный метод может быть вызван с использованием общего вызова отражения с использованием объекта java.lang.reflect.method или с помощью объекта net.sf.cglib.proxy.methodproxy. net.sf.cglib.proxy.methodproxy обычно предпочтительнее, потому что он быстрее.
пакет com.example.cglib; import org.springframework.cglib.proxy.enhancer; import org.springframework.cglib.proxy.methodinterceptor; import org.springframework.cglib.proxy.methodproxy; import java.lang.reflect.methodproxy; Цель частного объекта; / ** * Создать объект Proxy * * @param target * @return */ public object getInstance (объект цели) {this.Target = target; Enhancer Enhancer = новый Enhancer (); Enhancer.setSuperClass (this.Target.getClass ()); // метод обратного вызова Enhancer.setCallback (this); // Создать прокси -объект return Enhancer.create (); } @Override public object Intercept (объект o, метод метода, объект [] объекты, методпрокси -метод Прокси) Throws Throwable {System.out.println ("++++++++ до"+methodProxy.getSuperName ()+"+++++"); System.out.println (method.getName ()); Object result = methodProxy.invokesuper (o, объекты); System.out.println ("+++++++ после"+methodproxy.getSuperName ()+"+++++++++"); результат возврата; }} пакет com.example.cglib; import com.example.service.userservice; import com.example.service.impl.userserviceimpl;/** * test cglib */public class runcglib {public static void main (string [] args) {cglibproxy cglibproxy = newclibproxy (string); Userservice userservice = (userservice) cglibproxy.getinstance (new userserviceimpl ()); userservice.getName (1); userservice.getage (1); }}Результаты работы:
++++++ до cglib $ getName $ 0 ++++++++
GetName
------ GetName -----
++++++ после cglib $ getName $ 0 ++++++++
++++++ до CGlib $ getage $ 1 +++++++
getage
----- Getage -----
++++++ после Cglib $ getage $ 1 +++++++
Выше всего содержание этой статьи. Я надеюсь, что содержание этой статьи поможет всем, кто учится или работа. Я также надеюсь поддержать Wulin.com больше!