1. 程式人生 > >SpringBoot 2.X課程學習 | 第三篇:自動配置(Auto-configuration)

SpringBoot 2.X課程學習 | 第三篇:自動配置(Auto-configuration)

一、auto-configuration introduction

     自動配置是springboot的一大特性,它能在我們新增相應的jar包依賴的時候,自動為我們配置了這些元件的相關配置,我們無需配置或者只需要少量的配置就能執行我們編寫的專案。官網也對自動配置作了詳細說明:

     Spring Boot auto-configuration attempts to automatically configure your Spring application based on the jar dependencies that you have added. For example, if HSQLDB is on your classpath, and you have not manually configured any database connection beans, then Spring Boot auto-configures an in-memory database.

     上訴語句翻譯為中文為:SpringBoot自動配置嘗試根據您新增的JAR依賴性自動配置您的Spring應用程式。例如,如果HSQLDB在您的類路徑上,並且您沒有手動配置任何資料庫連線bean,那麼spring boot會自動配置記憶體中的資料庫。

     如果需要設定自動配置的話,方法是將@EnableAutoconfiguration註解新增到您的@configuration類中。

二、How to Realize Auto-Configuration(底層)

    1、要研究springboot的自動配置需要從

主程式類開始入手,請看下面程式碼:

@SpringBootApplication
public class MMVirusScanApplication {

    public static void main(String[] args) {
        SpringApplication.run(MMVirusScanApplication.class, args);
    }
}

    2、這就是主程式類,這個類最主要的部分是@SpringBootApplication,正是通過添加了這個註解,springboot應用才能正常啟動。再繼續檢視@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 {}

     這個註解最主要部分是:

  • @SpringBootConfiguration:這個註解標註在某類上,說明這個類是一個springboot配置類
  • @EnableAutoConfiguration:這個註解就是springboot能實現自動配置的關鍵
  • @ComponentScan:這個註解是元件掃描這個是我們最熟悉的註解,即使沒有使用過註解也經常在spring的配置檔案中使用過<context:component-scan base-package="com.xxx.xxx"/>, 元件掃描就是掃描指定的包下的類,並載入符合條件的元件。

     3、繼續研究@EnableAutoConfiguration註解:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

    Class<?>[] exclude() default {};

    String[] excludeName() default {};
}

     可以發現它也是一個組合註解,裡面最主要註解是:

  • @AutoConfigurationPackage:自動配置包,它也是一個組合註解,其中最重要的註解是@Import(AutoConfigurationPackages.Registrar.class),它是spring框架的底層註解,它的作用就是給容器中匯入某個元件類,例如@Import(AutoConfigurationPackages.Registrar.class),它就是將Registrar這個元件類匯入到容器中,可檢視Registrar類中registerBeanDefinitions方法,這個方法就是匯入元件類的具體實現。
		@Override
		public void registerBeanDefinitions(AnnotationMetadata metadata,
				BeanDefinitionRegistry registry) {
             //將註解標註的元資訊傳入,獲取到相應的包名
			register(registry, new PackageImport(metadata).getPackageName());
		}

    通過對registerBeanDefinitions方法進行DeBug如下:

  • @Import({AutoConfigurationImportSelector.class}