spring mapper注入到service失败的解决方法
背景:前段时间自己在研究springboot,并且把公司的小项目成功的用springboot改造了一下,对于springboot的约定大于配置的理念,很是赞同,项目结构和代码更加简洁优雅。这段时间不是太忙,所以把手头的项目准备改造一下,现在的项目用的是公司的传统的SSM,项目结构截图如下:
个人感觉代码和配置有点臃肿,参考springboot的理念,尽力减少配置文件,优化代码,让项目更加简洁优雅。
1,controller配置文件applicationContext-mvc.xml
controller的配置,不采用传统的bean配置的方式,直接改用扫描注入
<!-- 1.开启注解扫描 -->
<!-- springmvc的配置文件中不扫描带有@Service注解的类 -->
<context:component-scan base-package="com.droi.web">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
</context:component-scan>
<!-- 2.支持所有MVC注解 -->
<mvc:annotation-driven/>
<!-- 3.配置默认的url处理器 -->
<mvc:default-servlet-handler/>
<!----下面是一些页面视图解析和文件上传配置--->
注意:配置完,记得删除其中的bean配置的controller
2、service 配置文件 applicationContext-service.xml
既然采用注解实现,那么这个配置文件就可以干掉了,在代码里面用@Service注解
注意: 也可以直接用@Service直接注解,但是需要注意的是,Controller里面注入的时候,可能会提示注入失败,需要该为 实现类,而不是接口
3、mapper 配置文件 applicationContext-mapper.xml
项目采用的是Mybatis,区别于以往用的,因此没有所谓的dao 和 daoimpl等,直接就是mapper.java和mapper.xml来实现。
注意: mapper.java 是个接口,没有实现类,因为mybatis在我们获取mappe的时候,采用动态代理根据mapper.xml自动生成一个实例化类,真正调用的是代理实例化后的文件
同上,mapper也要采用注解实现,那么这个配置文件也可以干掉了,在代码里面用@Repository来注解,
但是需要加上配置去加入spring管理,以便注入:
service里面用@Autowired注入mapper的时候,却提示出错,
错误描述如下:No matching bean of type [*.*.UserMapper] found for dependency: expected at least 1 bean which
字面意思,貌似是spring没有扫描大mapper,但是的确配置了mapper的扫描路径啊:
问题排查: 既然怀疑,没有扫描到,那么 直接采用配置去获取
ApplicationContext.getBean("userMapper");
这样可以获取到,那么就是被扫描到了,只是注解失败。
问题继续排查:会不会是注入方式问题?
百度了 @Autowired 和 @Resource ,然后 把@Autowired该为@Resouce,居然成功了。因此继续分析原因
百度如下:
所以,改用@Resouce以后,spring就可也根据名字(byName)来注入成功。
如果的确还想用@Autowired来注入,那么久必须和@Qualifier配合使用,直接定名字
到此为止,mapper注入失败问题,已经解决,第一次写博客,如有什么不妥或者理解错误的地方,欢迎大家指正,如果对大家有帮助,也欢迎大家转载,但是请注明转载地址,谢谢,一起交流进步哦