首頁>技術>

Spring Boot中提供了一系列的註解比如@ImportAutoConfiguration和@EnableAutoConfiguration,它們最終都組合了@Import註解,那麼,它們之間有什麼區別呢?

@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 {};

}

105

Tomcat

最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • Apache Maven從入門到精通