SpringBoot 自动装配原理
Posted 闲言_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot 自动装配原理相关的知识,希望对你有一定的参考价值。
1 pom.xml
- 核心依赖在父工程中
- spring-boot-dependencies
- 我们在引入一些Springboot依赖的时候,不需要版本,就是因为有这些版本仓库
1.1在pom.xml中点击 查看父工程
1.2这个父工程里面还有一个父工程
1.3这个parent里面没有 父工程了
1.4管理了大量的jar 包版本
1.5在Spring-boot-starter-parent中 配置了资源过滤,不需要我们去配置了。
2启动器
<dependencies>
<!--启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
1.启动器:说白了就是SpringBoot的启动场景;
2.比如:Spring-boot-starter-web,他就会帮助我们自动导入web环境所有的依赖!
3.SpringBoot 会将所有的功能场景都变成一个个的启动器
3主程序
主程序就两个东西,一个注解和SpringApplication.run()
1.@SpringBootApplication 标注这个类是一个Springboot的应用
2.SpringApplication.run(DemoApplication.class, args);
将SpringBoot 应用启动,通过反射加载DemoApplication类的对象
表面意思
3.1注解
点进去它是一个组合注解
这个里面还有很多其他
1.@SpringBootConfiguration
SpringBoot的配置
2.@EnableAutoConfiguration
自动导入配置
3.@ComponentScan
扫描包,去除哪些东西
4.@ConfigurationPropertiesScan
配置扫描
@SpringBootConfiguration
点进去@SpringBootConfiguration
由一个configuration
配置的
@Configuration
:代表这个是一个Spring 配置类
说明启动类也是一个配置类
点进去@Configuration
发现它只有一个Component
注解,说明这也是Spring一个组件
3.2@EnableAutoConfiguration
自动导入配置
点进去
发现除了4个默认配置注解以外,还发现@AutoConfigurationPackage
自动配置包
@AutoConfigurationPackage
点进去@AutoConfigurationPackage
注解`
发现导入选择器
@Import(AutoConfigurationPackages.Registrar.class)
点进AutoConfigurationPackages
类
//导入初始化的一些bean
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports
//metadata 元数据
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata,
BeanDefinitionRegistry registry)
//PackageImport 导入元数据
register(registry, new PackageImport(metadata).getPackageName());
@Override
public Set<Object> determineImports(AnnotationMetadata metadata)
return Collections.singleton(new PackageImport(metadata));
回到@EnableAutoConfiguration
注解
查看另一个注解 @Import(AutoConfigurationImportSelector.class)
自动配置导入选择
@Import(AutoConfigurationImportSelector.class)
点进AutoConfigurationImportSelector
看看
看到AutoConfigurationImportSelector
类中选择组件的方法
public String[] selectImports(AnnotationMetadata annotationMetadata)
选择组件:就是选择哪些我们配置的pom.xml中的东西
点进loadMetadata
来到 AutoConfigurationMetadataLoader类的方法
回到AutoConfigurationImportSelector
类
- 继续分析 selectImports 方法
getCandidateConfigurations
获取所有的配置
List<String> configurations = getCandidateConfigurations(annotationMetadata,
attributes);
- 核心方法
getCandidateConfigurations
获取候选的配置loadFactoryNames
首先通过加载器加载所有的
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata,
AnnotationAttributes attributes)
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(
getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());
Assert.notEmpty(configurations,
"No auto configuration classes found in META-INF/spring.factories. If you "
+ "are using a custom packaging, make sure that file is correct.");
return configurations;
@SpringBootApplication
注解标注了 @EnableAutoConfiguration
说明一件事
@SpringBootApplication
: 标注这个类是一个SpringBoot 的应用:启动类下的所有资源被导入
继续看getCandidateConfigurations 方法
- 这个配置不为空
- META-INF/spring.factories
- 自动配置的核心文件
查看spring.factories文件
spring.factories 文件内容
Initializers
初始化的Application Listeners
监听的Auto Configuration Import Listeners
自动选择导入的包Auto Configuration Import Filters
Auto Configure
自动配置Failure analyzers
Template availability providers
查看spring.factories 文件中的WebMvcAutoConfiuration
WebMvcAutoConfiuration类
WebMvcProperties 类
spring.factories 文件从哪来?
&emspl先读了配置文件,才找到配置类
继续看getCandidateConfigurations
方法
点进去
来到springFactoriesLoader
类
查看loadSpringFactories方法
loadSpringFactories
方法 可以看到springboot 把所有的资源都加载到配置类中
Properties properties = PropertiesLoaderUtils.loadProperties(resource);
点击 FACTORIES_RESOURCE_LOCATION
常量
加载了spring.factories
文件的所有东西
4结论:
- SpringBoot所有的自动配置都是在启动的时候扫描并加载;
- 所有的自动配置类都在这里面 spring.factories
- 但是不一定生效,要判断条件是否成立
- 只有导入了对应的start,就有对应的启动器了
- 有了启动器,我们自动装配就会生效,然后就配置成功了!
- Springboot 启动的时候,从类路径下/META-INF/spring.factories 获取指定的值
- 将这些自动配置类导入容器,自动配置就会生效,帮我进行自动配置
- 以前我们需要自动配置的东西,Springboot帮我们做了
- 整合Java2E ,解决方案和自动配置的东西都在spring-boot-autoconfigure-2.2.5.RELEASE.jar 这个包下
- 它会把所有需要导入的组件,以类名的方式返回,这些组件就会被添加到容器
- 容器中也会存在非常多的xxAutoConfiguration的文件(@Bean),就是这些类给容器中导入了这个场景需要的所有组件 @Configuration,JavaConfig!
- 有了自动配置类,免去我们手动编写配置文件的工作
以上是关于SpringBoot 自动装配原理的主要内容,如果未能解决你的问题,请参考以下文章