一、springboot自动配置
什么是SpringBoot自动配置?
SpringBoot的自动配置,指的是SpringBoot会自动将一些配置类的bean注册进ioc容器,我们可以需要的地方使用@autowired或者@resource等注解来使用它。
“自动”的表现形式就是我们只需要引我们想用功能的包,相关的配置我们完全不用管,springboot会自动注入这些配置bean,我们直接使用这些bean即可。
SpringBoot如何实现自动配置?
其实说白了SpringBoot的自动配置,实际是依赖@Conditional来实现的。@Conditional是一个条件注解,是Spring4提供的一个新特性,用于根据特定条件来控制Bean的创建行为。
1、springboot获取配置的流程
上图是对springboot获取配置流程的简单总结。
- 运行主程序时,调用了@SpringBootApplication注解,这个注解又包含一个@Import注解,用于导入配置类。
- 这个@Import注解会去类路径下所有的META-INF/spring.factories中去搜索以“AutoConfiguration”为后缀的配置类;
- 对找到的每一个××AutoConfiguration配置类,根据其上的@EnableConfigurationProperties注解读取对于的××Properties类;
- 将读取到的××Properties中的属性值绑定到组件中
- 取用户配置文件,将配置的属性值绑定到组件中
- 将组件在容器中注册。
就这样完成了配置值的获取。
二、springboot启动流程
上图是对springboot启动流程的简单总结。
运行主配置类时,主要分为两大步骤:首先创建Springboot的Application对象,然后是运行run方法。
2.1创建Springboot的Application对象
创建的对象根据springboot获取配置的流程,绑定了配置里面的默认值。
主要实现的功能就是到META-INF/spring.factories目录下去寻找两类东西并保存起来。
- 一个是ApplicationContextInitializer,也就是容器的初始化器;
- 一个是ApplicationListener,也就是应用程序的监听。
保存的东西供run方法运行时调用。
2.2运行run方法
(1)去META-INF/spring.factories目录下去获取监听,注意获取的是ApplicationRunListener而不是ApplicationListener。
(2)配置环境,然后调用上一步获取的监听的environmentPrepared方法表示环境准备完成
(3)创建ioc容器
(4)应用初始化器
- 将配置好的环境在ioc容器中布置;
- 读取创建Springboot的Application对象是保存的两类东西的方法,一个是初始化器,一个是contextPrepared方法,也就是告诉系统容器准备就绪。
(5)在ioc中注册命令行参数对象
(6)调用(1)获取的ApplicationRunListener中的contextLoaded方法表示上下文环境准备完成
(7)刷新容器:也就是获取、创建和加载所有的组件、配置类和自动配置类。
(8)从容器中获取ApplicationRunner和CommandLineRunner,并调用其中的run方法;
(9)调用(1)获取的ApplicationRunListener中的finished方法表示容器创建完成
(10)返回配置好的ioc容器
文章来源:springboot运行流程和实际应用