qq_26119443
君归丨未归
采纳率0%
2021-05-04 01:24 阅读 65

求教:动态代理时为什么自动注入的只能是接口而不能是实现类?

其实关于这个看了挺多的文章,基本都说什么兄弟关系所以不能用实现类接,得用接口接,总感觉理解得不顺畅,兄弟关系跟不能用实现类接有必然关系吗?

我的代码逻辑如下:

1.我在service类上@service,spring应该会帮我创建一个该类的对象吧

2.启动了切面拦截和动态代理,spring又会给我创建一个jdk动态代理的对象,名字改为我原先的bean的名字

(疑问:此时实现了service父接口的bean到底是有一个还是有两个,动态代理的bean是重命名形式的偷梁换柱还是直接霸道覆盖掉之前的bean)

3.不开启jdk动态代理时,用service实现类接会正常注入service对象, 但是开启动态代理时如果用service实现类接的话会报错,

错误信息: Bean named 'monsterServiceImpl' is expected to be of type 'cn.tedu.service.MonsterServiceImpl' but was actually of type 'com.sun.proxy.$Proxy25'

也就是说autowired在bean中查找到的实际上就是代理类

疑问:autowired按照类型查找(实现类)不应该是只有一个类(目标类)吗,为什么执行结果就好像按照类型查找不到目标类的bean,然后根据autowired的规则继续按照名字查找,正好找到了代理类的bean,注入时发现类型是service实现类,而他找到的是代理类(此时是兄弟关系),因此注入失败,报错信息就是上面的: 自动注入的bean期望是一个service实现类但实际是代理类

所以说,如果启动了jdk动态代理,此时bean容器中代理类的bean就把我的@controller的bean覆盖掉了,我的@service的bean其实不是名字被占用了,而是直接就被覆盖掉就没有了是吗?又或者是spring刚开始就没给我创建目标类的bean?

感觉陷入了什么误区,希望各位大佬能给解答一下

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

3条回答 默认 最新

  • software7503 CSDN专家-赖老师(软件之家) 2021-05-04 07:15

    动态代理自动注入的只能是接口,因为接口是一种规范,接口下面可以有很多实现类,只要是这个接口对应的实现类都可以达到效果,减少了配置。

    点赞 评论 复制链接分享
  • QA_Assistant 有问必答小助手 2021-05-06 11:29

    您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

    如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

    ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

    点赞 评论 复制链接分享
  • QA_Assistant 有问必答小助手 2021-05-07 15:05

    非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!

    速戳参与调研>>>https://t.csdnimg.cn/Kf0y

    点赞 评论 复制链接分享

相关推荐