@AutoConfigurationPackage與@ComponentScan注解區(qū)別
引言
面試真是越來越卷了,最近又有小伙伴在微信上問到松哥這樣一個面試題,想到這兩個的區(qū)別其實還有點意思,因為整一篇文章和小伙伴們捋一捋。
AutoConfigurationPackage 就是自動配置包
首先,從名字上看,這兩個注解意義特別接近,@AutoConfigurationPackage
就是自動配置包,自動配置包的目的是能讓系統(tǒng)掃描到包內的 Bean;@ComponentScan
則是組件掃描,這個松哥在之前的教程中也多次提到過了,就不再贅述了,所以這里就有一個問題,這兩個注解有啥區(qū)別?
首先大家思考這樣一個問題:
現(xiàn)在大多數項目可能都是用的 MyBatis 或者 MyBatis-Plus 這樣的數據持久化框架,當我們在 Spring Boot 中使用 MyBatis 的時候,我們一般需要在 Mapper 接口上添加一個 @Mapper 注解,類似下面這樣:
@Mapper public?interface?UserMapper?{ }
或者在啟動類上加 Mapper 掃描注解去統(tǒng)一掃描所有的 Mapper 接口,類似下面這樣:
@SpringBootApplication @MapperScan(basePackages?=?"org.javaboy.auto_package") public?class?AutoPackageApplication?{ ????public?static?void?main(String[]?args)?{ ????????SpringApplication.run(AutoPackageApplication.class,?args); ????} }
平時我們都這樣寫,沒有任何問題,現(xiàn)在假設我們換一個寫法,假如我的類結構如下:
├── main │?? ├── java │?? │?? └── org │?? │?? └── javaboy │?? │?? └── auto_package │?? │?? ├── config │?? │?? │?? ├── AutoPackageApplication.java │?? │?? │?? └── UserController.java │?? │?? ├── mapper │?? │?? │?? └── UserMapper.java │?? │?? └── service │?? │?? └── UserService.java
小伙伴們看到,我把啟動類和 UserController 放在一個單獨的包中,UserMapper 和 UserService 也分別位于不同的包中,其中在 UserController 中注入了 UserService,在 UserService 中則注入了 UserMapper,大致上就這么一個關系。
按照我們之前對 Spring Boot 的理解,這個項目啟動肯定會報錯,因為默認情況下,系統(tǒng)掃描的 Bean 是啟動類所在的包以及子包下的所有 Bean(因為 @SpringBootApplication
注解在啟動類上),所以上面這個項目啟動的時候,能掃描到 UserController,但是掃描不到 UserService,所以啟動的時候會報錯,如下:
大家看下,這意思很明確,UserService 找不到,所以啟動失敗。
在啟動類上加 @ComponentScan 注解
解決這個問題的辦法很簡單,要么將啟動類放到根包下面,這樣所有的 Bean 默認就都能掃描到了,要么我們重新配置包掃描,這里我采用第二種方案,我們在啟動類上加 @ComponentScan
注解,重新指定掃描的包,如下:
@SpringBootApplication @ComponentScan(basePackages?=?"org.javaboy.auto_package") public?class?AutoPackageApplication?{ ????public?static?void?main(String[]?args)?{ ????????SpringApplication.run(AutoPackageApplication.class,?args); ????} }
加上之后,我們再次啟動,發(fā)現(xiàn)又報錯了,如下:
雖然再次出錯,但是跟之前的錯誤并不一樣,這次是沒找到 UserMapper 這個 Bean,說明 UserService 是找到了!
從這里我們就可以看出來,@ComponentScan
注解掃描組件是不會掃描到 @Mapper 注解的!
事實上,@ComponentScan
注解主要是掃描 Spring 家族的各種 Bean,如 @Controller、@Service、@Component、@Repository 以及由此衍生出來的一些其他的 Bean,對于 Spring 家族之外的 Bean,如 MyBatis 的 @Mapper、@MapperScan,JPA 的 @Entity 等,@ComponentScan
都掃不到!
誰能掃到呢?那就是我們今天的另外一個主角 @AutoConfigurationPackage
,這個注解其實就是專門用來掃這些第三方的各種 Bean 的。
現(xiàn)在,我們在項目啟動上加上 @AutoConfigurationPackage
注解,并設置需要掃描的位置,如下:
@SpringBootApplication @AutoConfigurationPackage(basePackages?=?"org.javaboy.auto_package") @ComponentScan(basePackages?=?"org.javaboy.auto_package") public?class?AutoPackageApplication?{ ????public?static?void?main(String[]?args)?{ ????????SpringApplication.run(AutoPackageApplication.class,?args); ????} }
此時,項目就可以成功啟動了,因為 @AutoConfigurationPackage(basePackages = "org.javaboy.auto_package")
注解可以掃描到 @Mapper 注解。
當然,這里只是為了給大家演示問題,實際場景下直接在啟動類上加 @MapperScan(basePackages = "org.javaboy.auto_package")
注解就可以了。因為 @MapperScan 注解是 mybatis-spring 提供的,而 @Mapper 是 MyBatis 自己提供的,兩個注解的出處本身就不同。
默認情況下,Spring Boot 項目的啟動注解中,實際上已經包含了 @AutoConfigurationPackage
注解,具體位置在 @SpringBootApplication
->@EnableAutoConfiguration
->@AutoConfigurationPackage
,默認該注解沒有指定 basePackages 屬性,表示使用啟動類所在的包作為根包,掃描該包下的所有第三方 Bean,所以我們平時在 Spring Boot 中使用 MyBatis 的時候,是不需要額外加 @AutoConfigurationPackage
注解的。
經過上面問題的演示,相信小伙伴們已經搞明白了 @AutoConfigurationPackage
和 @ComponentScan
的區(qū)別了吧?
總結
兩者都是用來掃描 Bean 的。
@ComponentScan
主要用來掃描和 Spring 容器相關的 Bean。
@AutoConfigurationPackage
主要用來掃描第三方的 Bean。
以上就是@AutoConfigurationPackage與@ComponentScan注解區(qū)別的詳細內容,更多關于@AutoConfigurationPackage@ComponentScan區(qū)別的資料請關注腳本之家其它相關文章!
相關文章
Mybatis-Plus實現(xiàn)用戶ID自增出現(xiàn)的問題解決
項目基于 SpringBoot + MybatisPlus 3.5.2 使用數據庫自增ID時, 出現(xiàn)重復鍵的問題,本文就來介紹一下解決方法,感興趣的可以了解一下2023-09-09mybatis3.4.6 批量更新 foreach 遍歷map 的正確姿勢詳解
這篇文章主要介紹了mybatis3.4.6 批量更新 foreach 遍歷map 的正確姿勢詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11Mybatis的collection三層嵌套查詢方式(驗證通過)
這篇文章主要介紹了Mybatis的collection三層嵌套查詢方式(驗證通過),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03logback和log4j日志框架堆棧信息添加TraceId方式
這篇文章主要介紹了logback和log4j日志框架堆棧信息添加TraceId方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09MyBatis實現(xiàn)動態(tài)SQL的實現(xiàn)方法
這篇文章主要介紹了MyBatis實現(xiàn)動態(tài)SQL的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-12-12