[转载]aop代理方式引起的spring注入bean(实现类)与获取bean(实现类)出错

作者:枫红一叶

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

描述:


  现象一 :A 为 接口,AImpl 为 A 的实现类,且 AImpl 受 aop 扫描,且 aop 无特殊配置


       此时若:Spring 中 注入 AImpl 类型的bean,获取一样     报错


         Spring 中 注入 A 类型的bean ,获取一样          成功


  现象二 :B 没有实现接口,B受 aop 扫描,且 aop无特殊配置


       此时若:Spring 中 注入 B 类型的bean,获取一样           成功


分析:


  1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 
  2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP 
  3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换


  现象一 :因为 AImpl 实现了 A 接口,所有自动使用了JDK proxy ,而JDK proxy 实现原理基于接口生成代理对象(详见下边链接)


       代理对象 类型不同于 AImpl ,所以报错


       JDK proxy 生成的代理对象也实现了A 接口,so  接口类型可以。


  现象二 :B 没有实现接口,故spring 采用 cglib 实现动态代理,其原理是生成子类(详见下边链接)


       so , 成功注入与获取。


解决:


   Spring 中添加配置  <aop:aspectj-autoproxy proxy-target-class="true"/>


 


参考:


   http://fuhuijun.iteye.com/blog/2253741


   JDK动态代理和CGLIB代理的区别


   Spring中AOP的两种代理方式(Java动态代理和CGLIB代理)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值