Spring-Boot 自动配置 原理分析
pom.xml
- Spring-Boot-dependencies: ==核心依赖==在父工程里
<parent>
<groupId>io.terminus.dalaran</groupId>
<artifactId>dalaran-parent</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
- 当我们写入或者引入依赖的时候,不需要制定版本,因为都在仓库中由==maven== 统一管理
启动器
- Spring-Boot的启动场景
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
- 比如 spring-boot-web-starter他会帮助我们自动导入web环境所有的依赖
- Spring-Boot会将所有的功能场景变成一个个的启动器,所以当我们需要某个功能的时候,只需要找到对应的启动器==start==就行了
主程序
//此处为注解,标注这是一个SpringBoot类,删掉程序则不能运行
//获取类下所有的资源导入
@SpringBootApplication
public class HelloworldApplication {
public static void main(String[] args) {
//启动程序
SpringApplication.run(HelloworldApplication.class, args);
}
}
注解
@SpringBootConfiguration //Springboot的配置
@Configuration //Spring配置类
@Component //说明这是一个Springle组件
@EnableAutoConfiguration //自动配置
@AutoConfigurationPackage //自动导入包
@Import({Registrar.class}) //自动导入注册器
@Import({AutoConfigurationImportSelector.class}) //自动导入选择器
List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes); //获取所有的配置
获取候选的配置
protected AnnotationAttributes getAttributes(AnnotationMetadata metadata) {
String name = this.getAnnotationClass().getName();
AnnotationAttributes attributes = AnnotationAttributes.fromMap(metadata.getAnnotationAttributes(name, true));
Assert.notNull(attributes, () -> {
return "No auto-configuration attributes found. Is " + metadata.getClassName() + " annotated with " + ClassUtils.getShortName(name) + "?";
});
return attributes;
}
- ==META-INF/spring.factories.==自动配置的核心配置
SpringApplication类
它主要作用为以下四点:
推断应用是一个普通的项目还是一个web项目
查找并且加载所有可用初始化容器,并且设置到Initializers属性之中
找出所有的应用程序监听器,并且设置到listeners属性之中
推断并且设置main方法的定义类,找到运行的主类
小结
Springboot所有的自动配置都是在启动的时候扫面并且加载:spring.factories所有的自动配置类都在这里面了,但是不一定都会生效,必须要满足条件,导入了对应的start,这样就有了相应的启动器,等有了启动器之后才会生效,自动装配就成功了。
特点
- springboot在启动的时候,从类路径下/META-INF/spring.factories获取指定的值;
- 将这些自动配置的类导入容器,自动配置就会生效,帮助我们进行自动配置;
- 以前我们需要自动配置的东西,现在springboot都帮我们完成了;
- 整合JavaEE,解决方法和自动配置的东西都在spring-boot-autoconfigure-2.2.0.RELEASE.jar这个包下;
- 它会把所有需要导入的组件,以类名的方式返回,这些组件就会被添加到容器之中;
- 容器中也会存在非常多的xxxAutoConfiguration的文件(@Bean),就是这些类容器中导入了这个场景需要的所有组件(并且自动配置),@Configuration,JavaConfig;
- 有了自动配置类,免去了我们手动编写配置文件的工作。