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 configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
        configurations = this.removeDuplicates(configurations);
        Set 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的包扫描,本质上等于配置

 

 

你可能感兴趣的:(互联网架构)