一、@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>配置