jdk动态代理和cglib代理区别

来源:互联网 发布:淘宝商店转让 编辑:程序博客网 时间:2024/06/05 03:33

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()即可

原创粉丝点击