springboot不扫描@repository的问题及解决

 更新时间:2024年05月29日 14:40:14   作者:Smaksze  
这篇文章主要介绍了springboot不扫描@repository的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

springboot不扫描@repository问题

问题

单独使用@repository注解注dao层,而且不使用@mapperscan扫描时,启动项目会报错:

Field xxxxMapper in com.sms.shiro.service.impl.xxxxServiceImpl required a bean of type ‘com.sms.shiro.mapper.xxxxMapper’ that could not be found.

一.@mapper和@repository的区别

1.@mapper是mybatis的注解,@repository是spring家族的注解。

2.使用@mapper注解时,spring并不认识,@autowired注入到service里的mapper会爆红。

二.回到问题中来

明明springboot里的ComponentScan扫描了启动器包下的所有含注解的组件,那为什么却找不到@repository的组件?

原因:

造成这个问题的原因是因为springboot在扫描时候自动过滤掉了接口和抽象类,所以@repository修饰的mapper接口并不能称为一个bean,自然也就无法注入到service中。

三.解决方式

第一种: 不使用@repository,在mapper层接口直接使用@mapper,但如果项目工程较大的话就会很麻烦。

第二种: 如果想使用@repository,因为springboot无法扫描到mapper接口,则在启动器上使用@mapperscan扫描所有mapper接口的包,如:@MapperScan("com.sms.shiro.*.mapper")

第三种: 其实使用@mapperscan注解扫描mapper接口后,mapper接口就不需要@repository和@mapper去注册bean了,但如果想项目结构比较明了,在使用了@mapperscan扫描后,@repository和@mapper都可使用,都不会报错了,但是使用@repository会解决在service中@autowired mapper爆红的问题。

SpringBoot关于@Mapper和@Repository的一些疑问

@Mapper 是 Mybatis 的注解,和 Spring 没有关系,@Repository 是 Spring 的注解,用于声明一个 Bean。

@Mapper

Mybatis 需要找到对应的 mapper,在编译的时候动态生成代理类,才能实现对数据库的一系列操作,所以我们需要在接口上添加 @Mapper 注解。

例如(这里只是为了演示并且sql不复杂,所以这里使用注解的方式来编写sql语句):

@Mapper
public interface UserMapper {

    @Select("select * from user where id = #{id}")
    User getById(Integer id);

    @Select("select * from user")
    List<User> getAll();
}

编写测试方法,可以发现加了自动装配注解的userMapper会出现报错(并不影响代码正常运行),这是因为@Mapper是Mybatis中的注解,我们没有显示的标明UserMapper是spring中的一个Bean,idea此时会认为在运行时找不到实例注入,所以会提示错误

在这里插入图片描述

虽然这个报错并不影响代码的正常运行,但是看着很不舒服,我们可以@Repository注解(也可以使用@Componet,只要注明这是一个bean就可以)来显示的说明UserMapper是一个bean

@Repository

@Repository 是spring提供的一个注解,用于声明 dao 层的 bean,如果我们要真正地使用 @Repository 来进行开发,那么我们需要手动实现UserMapperImpl,也就是说手写 JDBC代码!!!

@Repository
public class UserMapperImpl implements UserMapper{
	
	@Override
	public User getById(Integer id){
		// 装载Mysql驱动
		// 获取连接
		// 创建Statement
		// 构建SQL语句
		// 执行SQL返回结果
	}
}

@MapperScan(“com.xxx.xxx”)

如果我们不使用@Mapper注解,还有另一种方式让Mybatis找到mapper接口,那就是 @MapperScan 注解,可以在启动类上添加该注解,自动扫描包路径下的所有mapper接口。

@SpringBootApplication
@MapperScan("com.example.springboot_mybatis.mapper")
public class SpringbootMybatisApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootMybatisApplication.class, args);
    }
}

使用@MapperScan注解之后,就不需要在mapper接口上添加任何注解了!!

心得:

总的来说,@Mapper 和 @MapperScan 这两个必须有一个,否则就会出错!

@Repository 可有可无,对程序正常运行没什么影响,但是可以消除idea报错的问题

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java实现PDF转为线性PDF详解

    Java实现PDF转为线性PDF详解

    线性化PDF文件是PDF文件的一种特殊格式,可以通过Internet更快地进行查看。本文将通过后端Java程序实现将PDF文件转为线性化PDF。感兴趣的可以了解一下
    2021-12-12
  • Java Collections集合继承结构图_动力节点Java学院整理

    Java Collections集合继承结构图_动力节点Java学院整理

    这篇文章主要介绍了Java Collections集合继承结构图_动力节点Java学院整理,需要的朋友可以参考下
    2017-04-04
  • Java中的异常处理用法及其架构和使用建议

    Java中的异常处理用法及其架构和使用建议

    Java同样也提供了抛出异常、捕捉异常和finally语句的使用来处理程序异常,下面就来具体看一下Java中的异常处理用法及其架构和使用建议:
    2016-06-06
  • java基础学习笔记之泛型

    java基础学习笔记之泛型

    所谓泛型,就是变量类型的参数化。泛型是JDK1.5中一个最重要的特征。通过引入泛型,我们将获得编译时类型的安全和运行时更小的抛出ClassCastException的可能。在JDK1.5中,你可以声明一个集合将接收/返回的对象的类型。
    2016-02-02
  • 一篇文章带你深入了解Java基础(3)

    一篇文章带你深入了解Java基础(3)

    这篇文章主要给大家介绍了关于Java中方法使用的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-08-08
  • Java实现爬取百度图片的方法分析

    Java实现爬取百度图片的方法分析

    这篇文章主要介绍了Java实现爬取百度图片的方法,结合实例形式分析了java基于jsonp爬取百度图片的相关原理、操作技巧与注意事项,需要的朋友可以参考下
    2018-12-12
  • 新手小白看过来学JAVA必过IO流File字节流字符流

    新手小白看过来学JAVA必过IO流File字节流字符流

    这篇文章主要介绍了新手小白学JAVA到IO流File字节流字符流的重点,对流不清楚的新手同学快进来学习吧,大佬也可以进来温故一下
    2021-08-08
  • Java实现的zip工具类完整实例

    Java实现的zip工具类完整实例

    这篇文章主要介绍了Java实现的zip工具类,结合完整实例形式分析了Java针对zip文件指定路径压缩、递归压缩等相关操作技巧,需要的朋友可以参考下
    2018-12-12
  • dm.jdbc.driver.DMException网络通信异常的解决过程

    dm.jdbc.driver.DMException网络通信异常的解决过程

    最近一个项目里面出现了一个比较诡异的问题,给大家分享下,这篇文章主要给大家介绍了关于dm.jdbc.driver.DMException网络通信异常的解决过程,需要的朋友可以参考下
    2023-02-02
  • java实现找出两个文件中相同的单词(两种方法)

    java实现找出两个文件中相同的单词(两种方法)

    这篇文章主要介绍了java实现找出两个文件中相同的单词(两种方法),需要的朋友可以参考下
    2020-08-08

最新评论