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

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

     

  • 10
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
Spring-generator 是基于 javafx8 开发的图形界面 Spring 代码生成器,使用 Apache FreeMarker 作为代码文件的模板,用户可以一键将数据库中的表生成为任意风格的 .java 代码文件(比如经典的三模型)。 Spring-generator 不是框架,它不会影响现有的任何机构,它只是一个解决你重复做某些事情的工具,它也不拘束与某个语言,它的使命就是将数据库表结构取出来,剩下的就取决于你怎么使用 FreeMarker 编写模板生成你想要的文件。 工具支持所有实现 JDBC 规范的数据库;默认集成了Oracle、SqlServer、MySQL、PostgreSql 数据库驱动 jar 包,其他数据库可以自己添加依赖。 工具默认集成了以 MyBatis 作为持久化的模板,如果需要 JPA 相关等模板可以自己参考工具的文档进行编写。 特色功能预览 生成实体类 生成 WEB API相关接口 Controller 生成业务逻辑相关的 Service/ServiceImpl 生成操作数据库的 Dao 接口与 Mapper.xml 映射文件 生成单元测试等 软件最大的特色就是操作 SQL 类的 Assist 查询帮助类(Assist 是特别定制的查询工具,使用该工具一切操作都会变得超简单,比如:分页通过 Assist 只需要设置2个参数就可以实现,比如参数1=10,参数2=5,查询出来就是第10行到15行的数据,同时也可以防注入动态添加查询添加,去重,排序,自定义返回列等); 生成的实体类(可以自己修改模板按自己的风格生成): Dao 接口: Mapper.xml 文件:
Spring中,我们可以使用依赖注入(dependency injection)来注入Mapper对象。首先,确保你已经配置了MyBatis或者其他ORM框架,并且已经创建了Mapper接口和对应的Mapper实现类。 接下来,你可以在Spring的配置文件(如applicationContext.xml)中使用`<bean>`标签来定义Mapper对象的注入。例如,假设我们有一个名为`UserMapper`的Mapper接口,可以按照以下方式进行注入: ```xml <!-- 配置Mapper接口 --> <bean id="userMapper" class="com.example.UserMapper"/> <!-- 配置Service --> <bean id="userService" class="com.example.UserService"> <!-- 注入Mapper对象 --> <property name="userMapper" ref="userMapper"/> </bean> ``` 在上述示例中,我们先定义了一个名为`userMapper`的Bean,并指定了对应的实现类`com.example.UserMapper`。然后,我们在Service的Bean定义中使用`<property>`标签注入了`userMapper`对象。 接下来,在你的Service类中,你可以使用`@Autowired`注解将Mapper对象自动注入到成员变量中。例如: ```java @Service public class UserService { @Autowired private UserMapper userMapper; // ... } ``` 现在,你就可以在Service类中使用`userMapper`对象了。Spring会自动为你创建并注入`userMapper`实例。 需要注意的是,为了使依赖注入正常工作,确保你已经正确配置了Spring和MyBatis(或其他ORM框架),并且在Spring配置文件中正确地定义了Mapper对象和其他相关的Bean。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值