Spring AOP用两种动态代理机制:
- JDK标准动态代理
- CGLIB动态代理
CGLIB动态代理需要引入CGLIB的相关开源库(包含在spring-core中)。
如果目标对象至少实现了一个接口,那么会使用JDK动态代理。所有该对象实现的接口都会被代理。如果目标对象没有实现任何接口,则会使用CGLIB动态代理。
如果你想强制所有代理都使用CGLIB代理方式,那么需要考虑两个问题:
- 使用CGLIB,final方法将无法被切点匹配到,因为在运行时,创建的子类无法覆盖此方法
- 在Spring 4.0中,代理对象的构造方法不会被调用两次。
通过以下配置,强制使用CGLIB:
xml配置方式
<aop:config proxy-target-class="true">
<!-- other beans defined here... -->
</aop:config>
开启注解的方式
<aop:aspectj-autoproxy proxy-target-class="true"/>