@MapperScan
和 @Repository
是兩個與數據訪問層相關的注解,它們在功能上有一定的聯系,但也有明顯的區別。
一、相同點
1.?都與數據訪問層相關
-
@MapperScan
:用于掃描 MyBatis 的 Mapper 接口。MyBatis 是一個流行的持久層框架,Mapper 接口定義了數據庫操作的方法,@MapperScan
的作用是將這些接口掃描并注冊為 Spring 的 Bean,從而可以在 Spring 應用中方便地使用這些 Mapper。 -
@Repository
:用于標注數據訪問層的類,通常用于 DAO(Data Access Object)類。它是一個 Spring 的注解,用于標記一個類是數據訪問層的組件。在 Spring 的上下文中,被@Repository
標注的類會被注冊為一個 Bean,并且可以享受 Spring 提供的異常處理等功能。
2.?都與 Spring 的 Bean 管理有關
-
無論是
@MapperScan
還是@Repository
,它們最終的目的都是將相關的類或接口注冊為 Spring 的 Bean。這樣,這些 Bean 就可以在 Spring 的上下文中被管理,并且可以通過依賴注入的方式被其他組件使用。
二、區別
1.?作用對象不同
-
@MapperScan
:-
作用對象:作用于包或類上,用于掃描 MyBatis 的 Mapper 接口。
-
使用場景:當你使用 MyBatis 作為持久層框架時,需要通過
@MapperScan
來指定 MyBatis 的 Mapper 接口所在的包路徑,Spring 會自動掃描這些接口,并為每個接口創建一個代理對象,這個代理對象就是 Spring 的 Bean。 -
示例:
@MapperScan("com.example.mapper") @SpringBootApplication public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);} }
在這個例子中,Spring 會掃描
com.example.mapper
包下的所有接口,并為每個接口創建一個代理對象。
-
-
@Repository
:-
作用對象:作用于類上,用于標注數據訪問層的類(通常是 DAO 類)。
-
使用場景:當你使用傳統的 Spring 數據訪問方式(如 JDBC Template 或 JPA)時,可以使用
@Repository
來標注你的 DAO 類。這樣,Spring 會將這個類注冊為一個 Bean,并且可以享受 Spring 提供的異常處理等功能。 -
示例:
@Repository public class UserDao {public User getUserById(int id) {// 實現數據訪問邏輯} }
-
2.?功能側重點不同
-
@MapperScan
:-
功能側重點:主要功能是掃描 MyBatis 的 Mapper 接口,并為每個接口創建代理對象。這個代理對象會根據 MyBatis 的配置(如 XML 映射文件或注解)來實現具體的數據庫操作。
-
依賴框架:依賴于 MyBatis 框架。如果沒有使用 MyBatis,
@MapperScan
就沒有意義。
-
-
@Repository
:-
功能側重點:主要功能是標注一個類是數據訪問層的組件,并將這個類注冊為 Spring 的 Bean。它不依賴于具體的持久層框架,可以用于各種數據訪問技術(如 JDBC Template、JPA、MyBatis 等)。
-
依賴框架:依賴于 Spring 框架。它是一個 Spring 提供的注解,用于統一管理數據訪問層的組件。
-
3.?使用方式不同
-
@MapperScan
:-
使用方式:通常放在 Spring Boot 的主類或配置類上,指定 MyBatis 的 Mapper 接口所在的包路徑。
-
示例:
@MapperScan("com.example.mapper") @SpringBootApplication public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);} }
-
-
@Repository
:-
使用方式:直接標注在數據訪問層的類上。
-
示例:
@Repository public class UserDao {public User getUserById(int id) {// 實現數據訪問邏輯} }
-
4.?異常處理
-
@MapperScan
:-
異常處理:
@MapperScan
本身不直接提供異常處理功能。MyBatis 的異常處理主要依賴于 MyBatis 自身的異常處理機制。
-
-
@Repository
:-
異常處理:
@Repository
提供了異常處理的功能。當在數據訪問層拋出異常時,Spring 會將這些異常轉換為 Spring 的數據訪問異常(如DataAccessException
),從而使得異常處理更加統一和方便。
-
5.?與事務管理的配合
-
@MapperScan
:-
事務管理:
@MapperScan
掃描的 Mapper 接口通常會與事務管理器配合使用。事務管理器可以通過 Spring 的@Transactional
注解來管理事務,而@MapperScan
掃描的 Mapper 接口會參與到事務管理中。
-
-
@Repository
:-
事務管理:
@Repository
標注的類也可以與事務管理器配合使用。事務管理器可以通過 Spring 的@Transactional
注解來管理事務,而@Repository
標注的類會參與到事務管理中。
-
ok,以上就是本次分享的內容~