君归丨未归 2021-05-04 01:24 采纳率: 0%
浏览 262

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

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

我的代码逻辑如下:

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条回答 默认 最新

  • 关注

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

    评论

报告相同问题?

悬赏问题

  • ¥15 乘性高斯噪声在深度学习网络中的应用
  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于docker部署flink集成hadoop的yarn,请教个问题 flink启动yarn-session.sh连不上hadoop,这个整了好几天一直不行,求帮忙看一下怎么解决
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥30 python代码,帮调试,帮帮忙吧