Spring Boot中ImportAutoConfiguration註解與Import註解的區別
- 2019 年 12 月 20 日
- 筆記
@ImportAutoConfiguration是否可以替代@Import註解?@ImportAutoConfiguration和@EnableAutoConfiguration是否效果相同?
從根本上來說,@ImportAutoConfiguration是@Import的增強,限制了它使用的特定範圍。
使用@EnableAutoConfiguration時會掃描整個類路徑下,包括依賴引入的jar包所有的自動配置類(被註解了@Configuration的類),嘗試進行自動配置。比如,tomcat-embedded.jar。
而@ImportAutoConfiguration只運行在你註解中提供的配置類。下面是一個Spring Boot入口方法中使用@ImportAutoConfiguration的列子:
@ComponentScan("path.to.your.controllers") @ImportAutoConfiguration({WebMvcAutoConfiguration.class , DispatcherServletAutoConfiguration.class , EmbeddedServletContainerAutoConfiguration.class , ServerPropertiesAutoConfiguration.class , HttpMessageConvertersAutoConfiguration.class}) public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } }
所以說,更準確的來說,@ImportAutoConfiguration與@EnableAutoConfiguration的功能更相似,而且能夠更細粒度的控制導入的類。
@ImportAutoConfiguration在單元測試中也有應用場景,比如@AutoConfigureMockMvc註解便組合了@ImportAutoConfiguration。
@Target({ ElementType.TYPE, ElementType.METHOD }) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @ImportAutoConfiguration @PropertyMapping("spring.test.mockmvc") public @interface AutoConfigureMockMvc { // ... }
這樣,在單元測試的過程中既實現了自動配置的功能,又不必像@EnableAutoConfiguration那樣掃描並嘗試自動配置所有的自動配置類。
@ImportAutoConfiguration相關源碼如下:
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @Import(ImportAutoConfigurationImportSelector.class) public @interface ImportAutoConfiguration { /** * 導入的自動配置類 */ @AliasFor("classes") Class<?>[] value() default {}; /** * 導入的自動配置類。如果為空,則使用META-INF/spring.factories中指定的類,其中key為帶註解的類的全限定名稱。 */ @AliasFor("value") Class<?>[] classes() default {}; /** * 排除自動配置類 */ Class<?>[] exclude() default {}; }
原文鏈接:《SPRING BOOT中@IMPORTAUTOCONFIGURATION註解與@IMPORT和@ENABLEAUTOCONFIGURATION註解的區別》
Spring技術影片
CSDN學院:《Spring Boot 影片教程全家桶》