javascript
@import注解_Spring Boot 2 实战:@SpringBootApplication注解浅析
本文轉載自本人技術博客:felord.cn 轉載請注明出處
1. 前言
Spring Boot 都會有一個名為 xxApplication 的啟動類,里面有一個標準的 java 應用的入口 main 方法,用于啟動 Spring Boot 應用項目。@SpringBootApplication 是Spring Boot的核心注解,作用在啟動類上,在通常情況下Spring Boot在啟動時會自動掃描 @SpringBootApplication 所在類的同級包及下級包里的所有 Bean 。為什么一個小小的注解就能發揮這么大的作用?今天我們來一探究竟。
2. @SpringBootApplication
我們就從@SpringBootApplication 注解源碼開始一步步揭開謎底。看看這個注解都干了什么。
2.1 @SpringBootApplication 源碼
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
@AliasFor(annotation = EnableAutoConfiguration.class)
Class>[] exclude() default {};
@AliasFor(annotation = EnableAutoConfiguration.class)
String[] excludeName() default {};
@AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
String[] scanBasePackages() default {};
@AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")
Class>[] scanBasePackageClasses() default {};
}
@SpringBootApplication 注解是個復合注解,集成了@ComponentScan, @EnableAutoConfiguration, @SpringBootConfiguration 三個注解。
2.2 @ComponentScan 注解
Spring里諸如@Service,@Repository,@Component,@Controller等用來向Spring IoC 容器注入bean。@ComponentScan注解就是用來自動掃描被這些注解標識的類,使得這些類被發現并最終注入Spring IoC容器。你也可以通過設置@ComponentScan中的basePackages,includeFilters,excludeFilters屬性來動態確定自動掃描包范圍和過濾規則。默認情況下:它掃描所有類型,并且掃描范圍是@ComponentScan注解所在配置類包及子包的類。
2.3 @EnableAutoConfiguration
@AutoConfigurationPackage@Import(AutoConfigurationImportSelector.class)public @interface EnableAutoConfiguration { String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration"; Class>[] exclude() default {}; String[] excludeName() default {};}這也是個復合注解,該注解可以幫助 Spring Boot 應用將所有符合條件的 @Configuration 配置都加載到當前 Spring Boot 創建并使用的 IoC 容器中。該注解的的核心要屬于 @Import(AutoConfigurationImportSelector.class) ,AutoConfigurationImportSelector 是自動配置選擇器。其中注解@Import的作用是給容器中導入一個組件。
public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered { private static final AutoConfigurationEntry EMPTY_ENTRY = new AutoConfigurationEntry(); private static final String[] NO_IMPORTS = {}; private static final Log logger = LogFactory .getLog(AutoConfigurationImportSelector.class); private static final String PROPERTY_NAME_AUTOCONFIGURE_EXCLUDE = "spring.autoconfigure.exclude"; private ConfigurableListableBeanFactory beanFactory; // 環境 private Environment environment; // 類加載 private ClassLoader beanClassLoader; // 資源加載 private ResourceLoader resourceLoader; //----省略方法--------}該類實現了類加載器,資源加載器,BeanFactoryAware 和 EnvironmentAware,借助 SpringFactoriesLoader 工具類通過類似java SPI查找配置類的功能,實現了從 classpath 中搜尋所有 META-INF/spring.factories 配置文件,并將其中 org.springframework.boot.autoconfigure.EnableAutoConfiguration 對應的配置項通過反射實例化為標注了 @Configuration 的配置類,然后匯總加載到Spring IoC 容器。工作流程圖為(來源于網絡):
2.4 @SpringBootConfiguration 注解
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration public @interface SpringBootConfiguration { }@SpringBootConfiguration繼承自@Configuration,二者功能也一致,標注當前類是配置類,并會將當前類內聲明的一個或多個以@Bean注解標記的方法的實例納入到Spring IoC容器中,并且實例名就是方法名。 特別的是該注解標識這是一個 Spring Boot 項目。
3. 總結
我們簡單總結一下Spring Boot的啟動步驟。Spring Boot應用啟動main方法后執行了一系列事件邏輯(加載環境等等)有興趣可以去看源碼,然后
- 首先@AutoConfigurationPackage這個組合注解。加載AutoConfigurationPackages.Registrar類,Registrar類導入到容器中,而Registrar類作用是掃描主配置類同級目錄以及子包,并將相應的組件導入到Spring Boot創建管理的容器中。
- 然后將AutoConfigurationImportSelector導入到Spring IoC容器中,AutoConfigurationImportSelector作用是通過selectImports方法實現將配置類信息交給SpringFactoriesLoader進行一系列的容器創建過程,具體實現可查看上面的源碼。
總結
以上是生活随笔為你收集整理的@import注解_Spring Boot 2 实战:@SpringBootApplication注解浅析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 转载:逻辑思维提升表达
- 下一篇: java设置等待锁的时间_java的锁池