@EnableAutoConfiguration 是開啟自動配置的注解,在創建的 SpringBoot 專案中并不能直接看到此注解,它是由組合注解@SpringBootApplication 引入的,
讓我們先從程式的啟動類開始分析.
啟動類和@SpringBootApplication 注解
@SpringBootApplication
public class SpringLearnApplication {
public static void main(String[] args) {
SpringApplication. run(DemoApplication. class, args);
}
}
Spring Boot 專案創建完成會默認生成-個*Application 的入口類, 在默認情況下,無論是通過 IDEA 還是通過官方創建基于 Maven 的 Spring Boo 專案,入口類的命名規則都是artifactld+Application,
這個啟動類中最重要的就是@SpringBootApplication注解. 它是 Spring Boot 專案的核心注解,用于開啟自動配置,準確說是通過該注解內組合的@EnableAutoConfiguration 開啟了自動配置,
@SpringBootApplication 部分源代碼如下:
@Target(ElementType . TYPE)
@Retent ion(Retent ionPolicy . 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 = "basePackageClass")
Class<?>[] scanBasePackageClasses() default {};
//指定是否代理@Bean 方法以強制執行 bean 的生命周期行為
@AliasFor( annotation = Configuration.class)
boolean proxyBeanMethods() default true ;
}
通過源代碼可以看出,該注解提供了以下成員屬性(注解中的成員變數以方法的形式體現),
- exclude:根據類(Class) 排除指定的自動配置,該成員屬性覆寫了@SpringBoot-Application中組合的@ EnableAutoConfiguration 中定義的 exclude 成員屬性,
- excludeName :根據類名排除指定的自動配置,覆寫了@ EnableAutoConfiguration 中的excludeName 的成員屬性,
- scanBasePackages:指定掃描的基礎 package,用于激活@Component 等注解類的初始化,
- scanBasePackageClasses:掃描指定的類,用于組件的初始化,
- proxyBeanMethods:指定是否代理@ Bean 方法以強制執行 bean 的生命周期行為,此功能需要通過運行時生成 CGLIB 子類來實作方法攔截,該子類有一定的限制,比如配置類及其方法不允許宣告為 final 等,
proxyBeanMethods 的默認值為 true,允許配置類中進行 inter-beanreferences (bean 之 間的參考)以及對該配置的@Bean 方法的外部呼叫,如果@Bean 方法都是自包含的,并且僅提供了容器使用的普通工程方法的功能,則可設定為 false,避免處理 CGLIB 子類,SpringBoot 2.2 版本上市后新增該成員屬性,后面章節涉及的自動配置類中基本都會用到proxyBeanMethods,一 般情況下都配置為 false,
通過以上源代碼我們會發現,Spring Boot 中大量使用了@AliasFor 注解,該注解用于橋接到其他注解,該注解的屬性中指定了所橋接的注解類,如果點進去查看,會發現@SpringBootApplication 定 義的屬性在其他注解中已經定義過了,之所以使用@AliasFor注解并重新在@SpringBootApplication 中定義,更多是為了減少用戶使用多注解帶來的麻煩,
@SpringBootApplication注解的組合結構如下圖:

@SpringBootApplication除 了組合元注解之外,其核心作用還包括:激活SpringBoot 自 動 配 置 的 @EnableAutoConfiguration 、 激 活 @Component 掃 描 的@ComponentScan、激活配置類的@Configuration,其中@ComponentScan,@Configuration在Spring中常用到, 這里分析一下@EnableAutoConfiguration的功能.
注解@EnableAutoConfiguration功能決議
在未使用 Spring Boot 的情況下,Bean 的生命周期由 Spring 來管理,然而 Spring 無法自動配置@Configuration 注解的類,而 Spring Boot 的核心功能之- 就是根據約定自動管理該注解標注的類,用來實作該功能的組件是@EnableAutoConfiguration 注解,
@EnableAutoConfiguration 的主要功能是啟動 Spring 應用程式背景關系時進行自動配置,它會嘗試猜測并配置專案可能需要的 Bean,自動配置通常是基于專案 classpath 中引入的類和已定義的 Bean 來實作的,在此程序中,被自動配置的組件來自專案自身和專案依賴的 jar包中,
例如: 如 果 將 tomcat-embedded.jar 添 加 到 classpath 下 , 那 么@EnableAutoConfiguration 會認為你準備用 TomcatServletWebServerFactory 類,并幫你初始化相關配置,與此同時,如果自定義了基于 ServletWebServerFactory 的 Bean ,那么@EnableAutoConfiguration 將不會進行 TomcatServletWebServerFactory 類的初始化,這一系列的操作判斷都由 Spring Boot 來完成,
@EnableAutoConfiguration 注解的原始碼
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
//根據類(Class) 排除指定的自動配置
Class<?>[] exclude() default {};
//根據類名排除指定的自動配置
String[] excludeName() default {};
}
@EnableAutoConfiguration 會猜 測你需要使用的 Bean,但如果在實戰中你并不需要它預置初始化的 Bean,可通過該注解的 exclude 或 excludeName 引數進行有針對性的排除,比如,當不需要資料庫的自動配置時,可通過以下兩種方式讓其自動配置失效,
//通過@SpringBootApplication 排除 DataSourceAutoConfiguration
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class SpringLearnApplication {
}
或:
//通過@EnableAutoConfiguration 排除 DataSourceAutoConfiguration
@Configuration
@EnableAutoConfiguration( exclude = DataSourceAutoConfiguration.class)
public class DemoConfiguration {
}
被@EnableAutoConfiguration 注 解的類所在 package 還具有特定的意義,通常會被作為掃描注解@Entity 的根路徑,這也是在使用@SpringBootApplication 注解時需要將被注解的類放在頂級 package 下的原因,如果放在較低層級,它所在 package 的同級或上級中的類就無法被掃描到,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/169188.html
標籤:其他
上一篇:Java 類與物件
