JDK代理和CGLIB代理总结

1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP
(如果就是单纯的用IOC生成一个对象,也没有AOP的切入不会生成代理的,只会NEW一个实例,给Spring的Bean工厂 )

2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP
如何强制使用CGLIB实现AOP
* 添加CGLIB库
* 在spring配置文件中加入<aop:aspectj-autoproxy proxy-target-class="true"/>就能强制使用

3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换(没有实现接口的就用CGLIB代理,使用了接口的类就用JDK动态代理)

 

 

JDK动态代理和CGLIB字节码生成的区别?
* JDK动态代理只能对实现了接口的类生成代理,而不能针对类

           Proxy.newProxyInstance(

                   target.getClass().getClassLoader(),

                   target.getClass().getInterfaces(),//要绑定接口(这是一个缺陷,cglib弥补了这一缺陷)

                   this)
* CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法
  因为是继承,所以该类或方法最好不要声明成final

  1.     /**  
  2.      * 创建代理对象  
  3.      *   
  4.      * @param target  
  5.      * @return  
  6.      */  
  7.     public Object getInstance(Object target) {   
  8.         this.target = target;   
  9.         Enhancer enhancer = new Enhancer();   
  10.         enhancer.setSuperclass(this.target.getClass());   
  11.         // 回调方法   
  12.         enhancer.setCallback(this); 
  13.         // 创建代理对象   
  14.         return enhancer.create();   
  15.     }   
  16.   
  17.     @Override  
  18.     // 回调方法   
  19.     public Object intercept(Object obj, Method method, Object[] args,   
  20.             MethodProxy proxy) throws Throwable {   
  21.         System.out.println("事物开始");   
  22.         proxy.invokeSuper(obj, args);  //还是执行父类的方法
  23.       System.out.println("事物结束");   
  24.         return null;   
  25.     }   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值