spring mapper注入到service失败的解决方法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/afsvsv/article/details/78771591

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,居然成功了。因此继续分析原因

     百度如下:

(1)@Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。如下:
@Autowired
@Qualifier("userMapper")
private UserMapper userMapper;
(2)@Resource
@Resource默认按照ByName自动注入,由J2EE提供,需要导入包javax.annotation.Resource。@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略。
       那么问题,貌似找到了,我们@Repository("userMapper"),指定了名字来管理(byName)来给spring管理,而@Autowired默认是按照类型(byType)来注入对象的,回忆一下<bean type=".......">

       所以,改用@Resouce以后,spring就可也根据名字(byName)来注入成功。

        如果的确还想用@Autowired来注入,那么久必须和@Qualifier配合使用,直接定名字

        

     到此为止,mapper注入失败问题,已经解决,第一次写博客,如有什么不妥或者理解错误的地方,欢迎大家指正,如果对大家有帮助,也欢迎大家转载,但是请注明转载地址,谢谢,一起交流进步哦

     

没有更多推荐了,返回首页