Springboot的@SpringBootApplication注解详解

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

里面的主要注解是

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan

下面我们来逐个详解

1.首先看@SpringBootConfiguration

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

2.接下来看@ComponentScan

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

3.最后看@EnableAutoConfiguration

这个就是比较复杂

 其中主要是

@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})

3.1 我们先来看第一个@AutoConfigurationPackage

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

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

Registrar.class,我们点开

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

我们打上断点,进行检查

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

接下来计算一下

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

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

3.2接下来我们该看

@Import({AutoConfigurationImportSelector.class})

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

 我们还是打上断点

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

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

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

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

也就是实现了自动装配

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值