SpringAOP动态代理

AOP 思想的实现一般都是基于代理模式 ,在 Java 中一般采用 JDK 动态代理模式,但是我们都知道,JDK 动态代理模式只能代理接口而不能代理类。

动态代理的核心原理:生成一个新的代理类,替换目标执行(偷梁换柱)

Spring AOP 会按照下面两种情况进行切换,因为 Spring AOP 同时支持 CGLIB Proxy、JDK Proxy动态代理。JDK由官方所提供,CGLIB则是基于ASM框架实现。

- 如果目标对象的实现类实现了接口,Spring AOP 将会采用 JDK 动态代理来生成AOP代理类;即JDK代理条件为:目标类必须实现至少要实现一个接口。

- 如果目标对象的实现类没有实现接口而继承目标类,Spring AOP 将会采用 CGLIB 来生成 AOP 代理类。不过这个选择过程对开发者完全透明、开发者也无需关心。CGLIB不能代理被final修饰的方法。

JDK动态代理是通过java.lang.reflect.Proxy类来实现的,我们可以调用Proxy类的newProxyInstance()方法来创建代理对象。

CGLIB是一个高性能开源的代码生成包,它采用非常底层的字节码技术,对指定的目标类生成一个子类,并对子类进行增强。在Spring的核心包中已经集成了CGLIB所需要的包,所以开发中不需要另外导入JAR包。

你可能感兴趣的:(spring,java,spring)