注解@Repository 与 @Mapper的异同点

858 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情

作者平台:

本文一共1305字,预计阅读5分钟

前言

之前在使用springboot整合mybatis时,在mapper接口上用了@Repository注解,但是在项目启动的时候却报错了,具体报错信息如下:

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2022-03-19 10:35:21.936 ERROR 15260 --- [  restartedMain] o.s.b.d.LoggingFailureAnalysisReporter   : 

***************************
APPLICATION FAILED TO START
***************************

Description:

Field userMapper in com.jiangxia.service.impl.UserServiceImpl required a bean of type 'com.jiangxia.mapper.userMapper' that could not be found

意思就是缺少userMapper这个bean,找不到这个bean。但是明明用@Repository注解修饰了,怎么会找不到呢?为了解决这个问题就慢慢摸索下去。

@Repository注解

@Repository是Spring的注解,它和@Component,@Service,@Controller是没什么本质区别,都是声明作用,表示这个是一个bean。只是@Component是一个通用的Spring容器管理的单例bean组件。而@Repository@Service@Controller这三个就是针对不同的使用场景所采取的特定功能化的注解组件,但是也是用于声明一个 Bean。

但是@Repository不能单独使用。因为这个注解修饰接口本身没有就没有意义,只是一个标识的作用,可以理解为

就好比给你发了个驾驶证,只是作为一个你能开车的标识,但是如果你没车还是不行。所以要想真正是这个接口被扫描,使用@Repository时需要在启动类上加@MapperScan进行扫描操作,且使用@MapperScan时也可以不用接口层写@Repository。

Mapper注解

@Mapper是mybatis自身带的注解。在spring项目中,mybatis需要找到对应的mapper,在编译时生成动态代理类,与数据库进行交互,这时需要用到@Mapper注解:

@Mapper
public interface UserDao{
    ....
}

如果我们不想在每个接口上都写@mapper注解,那么还有一种方式就是上面提到的,可以在启动类上使用@MapperScan,定义包扫描规则,这样就所有的dao层的mapper接口都会被扫描到,而不用在每个接口上使用@mapper注解。

总结

所以可以发现@Repository和@Mapper注解都是用在持久层的接口之上使得其生成代理对象bean,并且交给spring容器管理。

但是如果使用@Repository注解,那么启动类上还需要配合@MapperScan在启动类上, 接口上不用加任何注解注解使用,不然并不能被注入,而@Mapper注解,则可以直接单独使用。或者直接在启动类上使用@MapperScan定义包的扫描规则, 接口上不用加任何注解,那么所定义的包下的所有接口都被会扫描并注入。

其他推荐