Spring AOP动态代理介绍,解决Spring Boot中无法正常启用JDK动态代理的问题
Spring AOP底层的动态代理实现有两种方式:一种是JDK动态代理,另一种是CGLib动态代理。 JDK动态代理 JDK 1.3版本以后提供了动态代理,允许开发者在运行期创建接口的代理实例,而且只能为接口创建代理实例。 如果被代理目标没有接口那么Spring也无能为力,Spring通过Java的反射机制生成被代理接口的新的匿名实现类。 JDK动态代理具体实现原理: 通过实现 InvocationHandlet 接口创建自己的调用处理器; 通过为Proxy类指定ClassLoader对象和一组interface来创建动态代理; 通过反射机制获取动态代理类的构造函数,其唯一参数类型就是调用处理器接口类型; 通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数参入; CGLib动态代理 CGLib 全称 Code Generation Library ,是一个强大的高性能字节码生成类库,可以实现运行期动态扩展Java类。 Spring在运行期采用CGLib的字节码技术为类创建一个子类,并在子类中拦截所有父类方法的调用,织入横切逻辑实现AOP面向切面编程。 注意事项 如果被代理的对象实现了接口,那么Spring默认会使用JDK动态代理,否则会强制使用CGLib实现动态代理(如果被代理的类被final关键字所修饰,那么代理会失败) 关于两者的性能,JDK动态代理所创建的代理对象