关于spring-aop:Spring-AOP-动态代理
本文剖析Spring AOP和动静代理原理和实现,Spring版本: 5.2.3.RELEASE 动静代理1.1 代理模式代理模式也叫做委托模式,它是一种根本的设计模式,其作用是提供委派角色以管制对实在对象的拜访。典型的代理模式通常蕴含一下三类角色 形象角色:它的作用是定义一组行为规范。形象角色个别出现为接口或抽象类实在角色:也叫做被委托角色、被代理角色代理角色:也叫做委托类,代理角色须要实现形象角色所定义的行为(即代理类须要实现形象角色所定义的接口),并且在实现接口办法的时候须要调用实在角色的相应办法动态代理类依赖于实在类,对每一个实在类作代理都须要对应一个代理类,动态代理大量应用会导致类的急剧收缩,区别于动态代理在编译期确定代理类和实在类的关系并且生成代理类。动静代理则是在运行期利用JVM的反射机制生成代理类的字节码,并通过类加载器载入执生成代理对象 1.2 JDK动静代理JDK动静代理是在运行时借助Proxy工具类静态方法创立实现了一组特定接口的代理类和对象,Proxy类是所有被创立的动静代理类的父类,每一个动静代理对象都会与特定的InvocationHandler对象绑定,对任意代理对象实现的接口办法的调用都会最终委派给InvocationHandler#invoke办法 // 定义形象角色接口public interface Subject { void sayHello(String name);}// 接口实现public class RealSubject implements Subject { @Override public void sayHello(String name){ System.out.println("hello, "+ name); }}// 编写调用解决类,实现invoke办法(加强逻辑的入口)public class MyInvocationHandler implements InvocationHandler { private Subject subject; MyInvocationHandler(Subject subject){ this.subject = subject; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{ //前置解决 System.out.println("Before method invoke..."); Object obj = method.invoke(subject, args); //后置解决 System.out.println("After method invoke..."); return obj; }}// 测试方法public class Client{ public static void main(String[] args) { Subject realSubject = new RealSubject(); MyInvocationHandler handler = new MyInvocationHandler(realSubject); Subject proxy = (Subject)Proxy.newProxyInstance(realSubject.getClass().getClassLoader(), realSubject.getClass().getInterfaces(), handler); proxy.sayHello("world"); }运行后果:Before method invoke...hello, worldAfter method invoke...从运行后果能够看出,对代理对象办法的调用会进入到自定义MyInvocationHandler#invoke办法,并在指标办法执行前后打印出了日志。将Proxy类生成的代理类通过反编译失去如下类文件,能够看到RealSubjectProxy继承自Proxy且实现了Subject接口,它定义了4个办法m0,m1,m2,m3,其中办法m3是对Subject接口sayHello办法的实现 ...