because it is a JDK dynamic proxy that implement

The bean 'A' could not be injected as a 'xxx.BClassName' because it is a JDK dynamic proxy that implements:
   CInterface

搜索了几篇文章,都是在说通过proxy-target-class=true或者transactional等来解决;解决办法要么跟问题本身属于弱有关,要么属于曲线救国。

这个问题其实我们不妨大胆直面它,因为日志信息已经说得比较直白了,我们来翻译一下:

bean实例A不能被当作B类用于注入,因为B类是一个实现了C接口的jdk动态代理

jdk动态代理和C接口放在一起描述,说明什么呢?说明它在强调此动态代理是面向接口的,不是面向java类的!

因此它认为不能作为java类来注入到其他对象中;

为什么不能呢?

因为jdk动态代理对类进行包装后,原生类隐藏了(->target),冒出来一个只代表接口实现的新生类;即接口申明的方法,新生类才会有。

如果你执意要以此新生类注入至其他bean实例,那么在runtime过程中,可能因为你调用的方法未在接口中声明而抛出异常;

为什么异常?因为新生类中压根就没有此方法。

而且这是在编译时不能被发现的,所以spring帮你预先防御,在启动时抛错,而不会等到运行时。

所以解决办法如下:

   @Autowired
   @Qualifier("A")
     CInterface b;

如果需要用到未在C接口中声明的类本身的方法,可以从b中取出原生类实例进行调用。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1.Spring整体架构 1)核心容器(Core Container) Core模块,主要包含了Spring框架基...
    Sponge1128阅读 1,258评论 0 1
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,663评论 1 32
  • 前言: 正文之前,容我小小的矫情一下。我知道每个人的生活有很多意外、有很多迷茫、但是“我相信”一件事坚持下去,就不...
    java小瓜哥阅读 2,668评论 0 0
  • 今年的九月份,我迎来了我的大学生活! 可当我来到了学校之后,我才发现跟我想象中的大学完全不一样,不论是环境,学习,...
    小佳大家阅读 300评论 2 1
  • 本章节列举了众多生活中活学活用的机会,影像阅读不仅仅是书本的阅读能力,还有视觉、视野、行为的综合感知能力提现。 0...
    刘震_4b35阅读 191评论 0 3

友情链接更多精彩内容