詳解 @MapperScan 注解和 @Mapper 注解


實際上,這是一個非常簡單的問題。我並沒有一口回絕他,讓他去百度。因為,新人都會經歷這個過程。好不容易,問你一次,你直接讓他百度,會打擊到他的。而且,別人會覺得你擺架子。

@Mapper 這個注解的定義如下:

@Documented
@Inherited
@Retention(RUNTIME)
@Target({ TYPE, METHOD, FIELD, PARAMETER })
public @interface Mapper {
  // Interface Mapper
}

@Mapper 一般我們用在接口上,代碼如下:

@Mapper
public interface UserDAO {
    @Select("select * from user where name = #{name}")
    User find(String name);
    @Select("select * from user where name = #{name} and pwd = #{pwd}")
    /**
      * 對於多個參數來說,每個參數之前都要加上@Param注解,
      * 要不然會找不到對應的參數進而報錯
      */
    User login(@Param("name")String name, @Param("pwd")String pwd);
}

使用 @Mapper,最終 Mybatis 會有一個攔截器,會自動的把 @Mapper 注解的接口生成動態代理類。這點可以在 MapperRegistry 類中的源代碼中查看。

@Mapper 注解針對的是一個一個的類,相當於是一個一個 Mapper.xml 文件。而一個接口一個接口的使用 @Mapper,太麻煩了,於是 @MapperScan 就應用而生了。@MapperScan 配置一個或多個包路徑,自動的掃描這些包路徑下的類,自動的為它們生成代理類。

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

當使用了 @MapperScan 注解,將會生成 MapperFactoryBean, 如果沒有標注 @MapperScan 也就是沒有 MapperFactoryBean 的實例,就走 @Import 里面的配置,具體可以在 AutoConfiguredMapperScannerRegistrar 和 MybatisAutoConfiguration 類中查看源代碼進行分析。

由此可見,動態代理和 AOP 知識非常的重要,各種框架都在大量的使用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM