其实关于这个看了挺多的文章,基本都说什么兄弟关系所以不能用实现类接,得用接口接,总感觉理解得不顺畅,兄弟关系跟不能用实现类接有必然关系吗?
我的代码逻辑如下:
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?
感觉陷入了什么误区,希望各位大佬能给解答一下