JDK动态代理:目标对象实现了接口,默认使用此代理,通过在运行期间创建一个接口的实现类来完成对目标对象的代理
cglib代理:针对类实现代理,在运行期间生成代理对象是针对目标对象扩展的子类,所以此时要是目标对象有final方法,就不能重写覆盖了,底层依靠ASM(开源的java字节码编辑类库)操作字节码实现的,性能比JDK强
如果非要使用cglib代理,可以设置proxy-target-class="true",但此时需要考虑两个问题:
1:无法通知(advise)final方法,因为他们不能重写覆盖
2:需要引入cglib二进制发行包
expose-proxy:有时候目标对象内部的自我调用将无法实现切面中的增强,如下示例:
public interface AService{
public void a();
public void b();
}
public class AServiceImpl implements AService{
@Transaction(propagation=Propagation.REQUIRED)
public void a(){
this.b();
}
@Transaction(propagation=Propagation.REQUIRES_NEW)
public void b(){}
}
此处的设置this指向目标对象,直接调用b方法将无法执行事务增强,此时修改expose-proxy=“”true” ,并且修改 ((AService)AopContext.currentProxy()).b()即可