天天看點

Springboot @SpringBootApplication注解詳解

一、@SpringBootApplication

放置在Springboot啟動類上,表明該類是開啟Springboot容器的入口,它是一個複合注解。裡面包含了包掃描,自動注入,配置注入的功能,下面就給大家介紹裡面的注解

@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}
)}
)
@ConfigurationPropertiesScan
           
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
           

這四個注解是原注解,大家可以參考https://blog.csdn.net/c17315377559/article/details/101282730

【1】@SpringBootConfiguration

它表示的是該類會作為Springboot的一個配置類,進入該注解,發現裡面包含@Configuration注解,@Configuration注解是Spring裡面的注解,在Spring裡,它表示該類也是一個配置類。進入@Configuration注解,我們發現他是被@Component所修飾的,是以該配置類也是一個元件。

【2】@EnableAutoConfiguration

它表示開啟自動配置功能。進入@EnableAutoConfiguration中,發現它仍然是一個組合注解。裡面包含以下兩個注解

@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
           

1、@AutoConfigurationPackage表示自動注入包,進入@AutoConfigurationPackage裡面。發現裡面有一個@Import注解。

@Import({Registrar.class})
           

(1)@Import注解表明給容器導入一個元件,這個元件的内容就由Registrar.class傳入的對象決定。進入到該對象中,我們發現

metadata源資料包含@SpringBootApplication修飾的類,包名等資訊。是以,@AutoConfigurationPackage注解的主要作用就是将@SpringBootApplication修飾的類的同包,子孫包下的所有元件都掃描到Spring容器中。

AutoConfigurationPackages.register(registry, (new AutoConfigurationPackages.PackageImport(metadata)).getPackageName());
           

2、@Import({AutoConfigurationImportSelector.class})

表示根據上述所說@Import的作用是導入元件,導入自動配置選擇器的元件。當我們進入到AutoConfigurationImportSelector中,注意一下的方法

protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AutoConfigurationMetadata autoConfigurationMetadata, AnnotationMetadata annotationMetadata) {
    if (!this.isEnabled(annotationMetadata)) {
        return EMPTY_ENTRY;
    } else {
        AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
        List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
        configurations = this.removeDuplicates(configurations);
        Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
        this.checkExcludedClasses(configurations, exclusions);
        configurations.removeAll(exclusions);
        configurations = this.filter(configurations, autoConfigurationMetadata);
        this.fireAutoConfigurationImportEvents(configurations, exclusions);
        return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
    }
}
           

autoConfigurationMetadata 表示的是需要導入元件的全路徑名

annotationMetadata表示的是被@SpringBootApplication辨別類的資訊

Configurations包含了非常多的自動配置類,這些類都會被導入到Spring容器中

getCandidateConfigurations會幫我們去spring-boot-autoconfigure-2.2.0.RELEASE/META-INF/spring.factories中擷取EnableAutoConfiguration指定的值。将指定的值導入到Spring容器中,幫我們進行自動配置的功能。

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
           
.................

【3】@ComponentScan

用來将指定包(如果未指定就是将目前類所在包及其子孫包)加入SpringIOC的包掃描,本質上等于<context:component-scan>配置

繼續閱讀