關於 mybatis 的 @MapperScan 用法心得
2. 從網上搜 MapperScan,大部分說是通過 basePackage 指定掃描多個包,本身沒問題,但不是一個完美的方案。原因如下:
(1)如果掃描的包名是一個較頂級的,那麼,一些不是 mapper 的 interface 也會被處理成 mapper 而被建立成一個 spring bean,造成系統無法啟動,這肯定不行。
(2)只有縮小包的範圍,最好是隻配置 mapper 對應包,但如果把所有包含 mapper 的包羅列出來,則也存在不足。
- 其一,會導致列表變得比較長。用萬用字元解決一部分問題,但需要包包滿足一些統一的規則。另外,對於層級不同的情況,不好處理。
- 其二,則降低了擴充套件性,因為每增加或調整 mapper 包,都要到 @MapperScan 中去註冊。業務程式碼的變更影響了框架性的程式碼。尤其是對於多模組的情況,這個問題變得越發隱晦:誰能想到多引用一個模組就需要配置一下 @MapperScan?
- 其三,違背依賴的原則,本來框架不依賴業務,現在變成了框架反過來要因業務變化而調整程式碼。
3. 因此,我認為最好的方式是,在 @MapperScan 中,使用 basePackage + annotationClass 元件解決問題。
(1)所有的 mapper 上加上 @Mapper 註解。這是合理的,因為本身 mapper 屬於一類特殊的介面,理應該要通過特殊註冊進行區分。
(2)有了第1條,basePackage 就可以指定一個較頂級的包名了
通過上面兩條,一方面解決了 mapper 包動態變化的問題,因為業務上的程式碼一般會有一個統一的包字首,典型的如 com.cortName, 那麼就可以把它作為 basePackage,只需要配置一次,後面的變化都不受影響。
示例:
@MapperScan(basePackages = {"com.biz1", "com.group2"}, annotationClass = Mapper.class)