Springboot的@SpringBootApplication注解详解

该注解作用在MainApplication里面,会将该类所在的包内所有组件全部装配

里面的主要注解是

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan

Springboot的@SpringBootApplication注解详解_第1张图片

下面我们来逐个详解

1.首先看@SpringBootConfiguration

我们点入,发现这就是个简单的Configuration

Springboot的@SpringBootApplication注解详解_第2张图片

2.接下来看@ComponentScan

这个就是简单的指明扫描的包,也不是太重要

3.最后看@EnableAutoConfiguration

这个就是比较复杂

Springboot的@SpringBootApplication注解详解_第3张图片

 其中主要是

@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})

3.1 我们先来看第一个@AutoConfigurationPackage

意思是自动配置包,点开看源码

Springboot的@SpringBootApplication注解详解_第4张图片

 发现这是一个import导包,并不复杂,那么核心必然存在于所导入的内容上,也就是

Registrar.class,我们点开

Springboot的@SpringBootApplication注解详解_第5张图片

 这里面是一个静态内部类,包含两个方法

我们打上断点,进行检查

Springboot的@SpringBootApplication注解详解_第6张图片

 可以看到几个有趣的信息,比如source就是MainApplication

接下来计算一下

(new AutoConfigurationPackages.PackageImports(metadata)).getPackageNames()

Springboot的@SpringBootApplication注解详解_第7张图片

 可以看到,这正是我们的MainApplication所在的包,也就是装配调用的包

3.2接下来我们该看

@Import({AutoConfigurationImportSelector.class})

这只是一个简单的导入,那么真正核心的部分必然是导入的class,我们点开进去

Springboot的@SpringBootApplication注解详解_第8张图片

 我们还是打上断点

Springboot的@SpringBootApplication注解详解_第9张图片

 这里是不是有个东西很熟悉annotationMetadata,这个东西之前我们见过,就是所有组件

然后我们看看他进行了什么操作

AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
将annotationMetadata的内容转化为AnnotationAttributes 类型
List configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
再把annotationMetadata内容转化为list列表
configurations = this.removeDuplicates(configurations);
去除配置configurations
Set exclusions = this.getExclusions(annotationMetadata, attributes);
获取exclusions 
this.checkExcludedClasses(configurations, exclusions);
configurations.removeAll(exclusions);
移除exclusions 
configurations = this.getConfigurationClassFilter().filter(configurations);
this.fireAutoConfigurationImportEvents(configurations, exclusions);

经过这一系列操作,我们成功去除了多余的组件

也就是实现了自动装配

你可能感兴趣的:(spring,boot,java,spring)