严格来说并不是BUG,只是我对这个注解理解有误
场景: 项目中存在两个分支,需要我将第一个分支中的代码复制到第二个分支中,并将其中的controller,service,mapper单独复制一份并在类名前加上前缀
service中的bean的注入方式是@Resource,变量名就是类名的小写,我将mapper复制一份之后,service只更改了注入Bean的类名,没有修改bean的变量名,然后直接报错了
Exception encountered during context initialization - cancelling refresh attempt:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name '一个Controller': Injection of resource dependencies failed; nested exception is
org.springframework.beans.factory.BeanCreationException: Error creating bean with name '一个ServiceImpl': Injection of resource dependencies failed; nested exception is
org.springframework.beans.factory.BeanCreationException: Error creating bean with name '一个ServiceImpl': Injection of resource dependencies failed; nested exception is
org.springframework.beans.factory.BeanCreationException: Error creating bean with name '一个ServiceImpl': Injection of resource dependencies failed; nested exception is
org.springframework.beans.factory.BeanNotOfRequiredTypeException: Bean named '同下的Mapper' is expected to be of type '全类名.Mapper' but was actually of type 'com.sun.proxy.$Proxy341'
The bean 'xxxMapper' could not be injected as a '全类名.前缀XxxMapper' because it is a JDK dynamic proxy that implements:
com.baomidou.mybatisplus.core.mapper.BaseMapper
Action:
Consider injecting the bean as one of its interfaces or forcing the use of CGLib-based proxies by setting proxyTargetClass=true on @EnableAsync and/or @EnableCaching.
甚至还报redis连接超时.....
我下意识的认为是mybatis中的xml写的有问题(这玩意出问题之后报错信息也挺奇怪的),于是一个个找,一个个看是哪个文件,捣鼓了两个小时也没找到啥问题,最后才发现是注入的问题
我只知道 @Resource 会先使用BeanName注入变量,被spring注册的Bean使用类名小写开头作为beanName,但是我不知道@Resource使用的BeanName是TM的变量名啊,这就导致使用变量名查找到的bean不能被注入到我复制出来的那个bean中,并且由于找到了bean还不会使用type来继续查找bean。。。这就导致查找的bean不能被注入到变量中导致报错,回过头来发现原本的报错信息好像挺准确的...
最后将注入方式改成了@Autowired就能正常启动了(或者把变量名改了)