@MapperScan,@Mapper和@Repository

@MapperScan 扫描方式

@MapperScan 注解会将指定目录下所有 DAO 类封装成 MyBatis 的 BaseMapper 类,然后注入 Spring 容器中,不需要额外的注解,就可以完成注入,常见的 DAO 定义如下:

package com.xxx.xxx.xxx.dao;
public interface SysUserDao extends BaseMapper {

}

需要注意的是:@MapperScan 扫描路径下除了 MyBatis 的 DAO 类,不应该有自定义的普通 DAO 接口及其实现类

工程启动类使用了扫描注解:

@MapperScan({"com.xxx.xxx.xxx.dao"})

如果使用了 @MapperScan 则DAO接口上不需要任何注解。

@Mapper 注解方式

如果在DAO上加了@Mapper 则启动类上不需要在加@MapperScan注解.

常见的错误使用方法是

1、启动类上加了@MapperScan 在Dao 上也加了@Mapper 或者@Repository注解。

2、启动类上没有加@MapperScan注解,但是在Dao接口上加了@Repository注解那么启动时候就会报错。(找不到xxx.Mapper)
@Repository 是配合spring mvc 中的xml配置使用的。

在spring mvc中为了让 Spring 能够扫描类路径中的类并识别出 @Repository 注解,需要在 XML 配置文件中启用Bean 的自动扫描功能,这可以通过实现。

 使用 @Repository 将DAO类声明为Bean 

 package com.xxx.xxx.xxx.dao; 
 @Repository 
 public class SysUserDaoImpl implements SysUserDao{

 } 
XML 配置文件中启动 Spring 的自动扫描功能
 
  
 

如此,我们就不再需要在 XML 中显式使用 进行Bean 的配置。Spring 在容器初始化时将自动扫描 base-package 指定的包及其子包下的所有 class文件,所有标注了 @Repository 的类都将被注册为 Spring Bean。

为什么 @Repository 只能标注在 DAO 类上呢?这是因为该注解的作用不只是将类识别为Bean,同时它还能将所标注的类中抛出的数据访问异常封装为 Spring 的数据访问异常类型。 Spring本身提供了一个丰富的并且是与具体的数据访问技术无关的数据访问异常结构,用于封装不同的持久层框架抛出的异常,使得异常独立于底层的框架。

你可能感兴趣的:(Springboot,spring,java,spring,boot)