使用JDK动态代理
Spring AOP默认使用JDK动态代理(基于接口的代理)。
如果被代理的目标对象已经实现了接口,则使用JDK动态代理。如果目标对象未实现任何接口,则会创建CGLIB代理。
使用CGLIB代理注意
- final方法不建议使用,因为它们无法被覆盖。
- 除非强制使用CGLIB,需要将元素
<
aop:config>
的属性proxy-target-class值设置为true。 - 需要CGLIB库,找不到CGLIB库类时,Spring会发出警告。
- 代理对象的构造函数将被调用两次。这是因为CGLIB代理会为每个代理对象生成子类。构造函数中只做赋值和初始化,不能实现其他的逻辑。