關於MyBatis的@Mapper和@MapperScan注解的一點思考


  最近有空回顧mybatis,想起@Mapper注解一直沒弄明白是干嘛的,代碼上的注釋寫的很簡單(Marker interface for MyBatis mappers),開發過程中也沒用到,但網上各種資料偶有出現他的身影。問了度娘,都沒講清楚,我決定自己思考下這個問題,看看他究竟是干嘛用的。

1、來源

  Mapper來自mybatis-3.5.3.jar包

  MapperScan來自mybatis-spring-2.0.3.jar包

2、作用

  Mapper注解沒有被任何類接口引用,看不出來有何作用

  MapperScan注解被MapperScannerRegistrar的registerBeanDefinitions方法所引用,目的是將basePackages定義的所有包下的所有接口生成一個org.apache.ibatis.binding.MapperProxy代理bean,這樣就可以用@Autowired注解進行裝配使用了。

3、疑問

  Mapper注解沒有被任何類使用,那他用來干嘛的,MapperScan用來掃描定義包下的所有的接口,無論這個接口你的設計目的是用來干嘛的,他都會生成一個bean(經測試,@Service實現的接口和@FeignClient注解的接口,即使他已經都相關的程序注冊了一個bean,MapperScan還是會將這些接口再注冊一個bean,導致出錯)。

  如此不合理的地方,到底是哪里出現問題?

4、我的思考

  帶着上面的問題,我又在重新查看了@MapperScan,發現里面有個annotationClass,默認值是Annotation.classs。

Class<? extends Annotation> annotationClass() default Annotation.class;

  假若我們的注解如此寫呢,是不是能解決上面的2個問題。

@MapperScan(basePackages = "com.zhi.test", annotationClass = Mapper.class)

  經驗證,Mapper找到了合理的使用,一些無關的接口也不再注冊為一個bean。

 

以下僅我的一點思考,如有錯誤,歡迎指正。


免責聲明!

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



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