MyBatis与Spring Data关于@Repository注解的注意事项
MyBatis之@Repository注解
@Repository是Spring框架提供的一种注解,来自如下包
import org.springframework.stereotype.Repository;
一般在SSM开发中编写MyBatis的DAO接口时使用,如下所示
@Repository
public interface UserDao{
}
在DAO接口中注解了@Repository之后,在Service层才能利用Spring的容器注入
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
}
在这里注意,如果DAO接口上不使用注解的话,是不能在Service中使用@Autowired进行注入的(经过试验之后,发现是可以不加@Repository注解的),或者使用配置文件的方式。
参考博文
Mybatis MapperScannerConfigurer 自动扫描 将Mapper接口生成代理注入到Spring
https://www.cnblogs.com/jpfss/p/7799806.html
经过本人查阅资料找到这篇博文,文中提到:
MapperScannerConfigurer 支 持 过 滤 由 指 定 的 创 建 接 口 或 注 解 创 建 映 射 器 。 annotationClass 属性指定了要寻找的注解名称。 markerInterface 属性指定了要寻找的父 接口。如果两者都被指定了,加入到接口中的映射器会匹配两种标准。默认情况下,这两个 属性都是 null,所以在基包中给定的所有接口可以作为映射器加载。
被发现的映射器将会使用 Spring 对自动侦测组件(参考 Spring 手册的 3.14.4)默认的命 名策略来命名。也就是说,如果没有发现注解,它就会使用映射器的非大写的非完全限定类名。但是如果发现了@Component 或 JSR-330 的@Named 注解,它会获取名称。注意你可以 配 置 到 org.springframework.stereotype.Component , javax.inject.Named(如果你使用 JSE 6 的话)或你自己的注解(肯定是自我注解)中,这 样注解将会用作生成器和名称提供器。
所以在DAO持久层的Mapper接口上即使不加@Repository,@Component等注解,也能注入实例到Spring中,被Service层引用。
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
<property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" />
<property name="sqlSessionFactory" ref="sqlSessionFactory" />
</bean>
Spring Data 之 Repository接口
Repository 接口是 spring Data 的一个核心接口,它不提供任何方法,开发者需要在自己定义的接口中声明需要的方法。若我们定义的接口继承了Repository,则该接口会被 IOC容器识别为一个Repository Bean,纳入到 IOC容器中,进而可以在该接口中定义满足一定规范的方法。IOC容器中实际存放了继承了Repository的接口的实现类,而这个实现类由spring帮助完成 。
Spring Data 可以让我们只定义接口,只要遵循 Spring Data 的规范,就无需写实现类。
与继承 Repository 等价的一种方式,就是在持久层接口上使用 @RepositoryDefinition 注解,并为其指定 domainClass 和 idClass 属性。两种方式是完全等价的。
public interface Cat2Repository extends Repository<Cat,Integer> {
}
@RepositoryDefinition(domainClass=Cat.class,idClass=Integer.class)
public interface Cat2Repository {
基础的 Repository 提供了最基本的数据访问功能,其几个子接口则扩展了一些功能。它们的继承关系如下:
Repository: 仅仅是一个标识,表明任何继承它的均为仓库接口类
(1) CrudRepository: 继承 Repository,实现了一组 CRUD 相关的方法
(2)PagingAndSortingRepository: 继承 CrudRepository,实现了一组分页排序相关的方法
(3)JpaRepository: 继承 PagingAndSortingRepository,实现一组 JPA 规范相关的方法
自定义的 XxxxRepository 需要继承 JpaRepository,这样的 XxxxRepository 接口就具备了通用的数据访问控制层的能力。
public interface Cat2Repository extends Repository<Cat,Integer> {
/**
* 2. 若我们定义的接口继承了Repository,则该接口会被IOC容器识别为一个Repository Bean纳入到IOC容器中,
* 进而可以在该接口中定义满足一定规范的方法。
* 3. 实际上也可以通过@RepositoryDefinition,注解来替代继承Repository接口。
* 4. 查询方法以find | read | get开头;
* 5. 涉及查询条件时,条件的属性用条件关键字连接,要注意的是条件属性以首字母大写。
* 6.使用@Query注解可以自定义JPQL语句实现更灵活的查询。
*/
Cat findByCatName(String catName);
@Query("from Cat where catName=:cn")
Cat findMyCatName(@Param("cn") String catName);
}
如上方法所示,在该接口中定义满足一定规范的方法,就能完成数据库操作的相关功能。
我们定义的接口继承了Repository,则该接口会被 IOC容器识别为一个Repository Bean,所以不需要在类上面使用@Repository注解。