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