SpringBoot自动配置
宁在春 人气:0前言
SpringBoot
是我们经常使用的框架,那么你能不能针对SpringBoot
实现自动配置做一个详细的介绍。如果可以的话,能不能画一下实现自动配置的流程图。牵扯到哪些关键类,以及哪些关键点。下面我们一起来看看吧!!
阅读完本文:
- 你能知道 SpringBoot 启动时的自动配置的原理知识
- 你能知道 SpringBoot 启动时的自动配置的流程
- 以及对于 SpringBoot 一些常用注解的了解
一步一步 debug 从浅到深。
注意
:本文的 SpringBoot 版本为 2.5.2
一、启动类
前言什么的,就不说了,大家都会用的,我们直接从 SpringBoot
启动类说起。
@SpringBootApplication public class Hello { public static void main(String[] args) { SpringApplication.run(Hello.class); } }
@SpringBootApplication
标注在某个类上说明这个类是 SpringBoot 的主配置类, SpringBoot 就应该运行这个类的main方法来启动 SpringBoot 应用;是我们研究的重点!!!它的本质是一个组合注解,我们点进去,看看javadoc
上是怎么写的,分析从浅到深,从粗略到详细。
我们点进去看:
@Inherited @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) public @interface SpringBootApplication {}
Javadoc
上是这么写的
表示声明一个或多个@Bean方法并触发 auto-configuration 和 component scanning 的 configuration 类。 这是一个方便的注解,相当于声明了 @Configuration 、 @EnableAutoConfiguration 和@ComponentScan 。
---为什么它能集成这么多的注解的功能呢?
是在于它上面的 @Inherited
注解, @Inherited
表示自动继承注解类型。
这里的最重要的两个注解是 @SpringBootConfiguration
和 @EnableAutoConfiguration
。
1.1、@SpringBootConfiguration
我们先点进去看看 @SpringBootConfiguration
注解:
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Configuration @Indexed public @interface SpringBootConfiguration {}。
1.2、@EnableAutoConfiguration
再看看 @EnableAutoConfiguration
.
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import(AutoConfigurationImportSelector.class) public @interface EnableAutoConfiguration {}
1.3、@ComponentScan
@ComponentScan
:配置用于 Configuration 类的组件扫描指令。 提供与 Spring XML
的 <context:component-scan>
元素并行的支持。 可以 basePackageClasses
或basePackages
( 或其别名value )来定义要扫描的特定包。 如果没有定义特定的包,将从声明该注解的类的包开始扫描。
作为了解,不是本文重点。
1.4、探究方向
主要探究图中位于中间部分那条主线,其他只会稍做讲解。
二、@SpringBootConfiguration
我们刚刚已经简单看了一下 @SpringBootConfiguration
啦。
@Configuration @Indexed public @interface SpringBootConfiguration {}
它是 springboot
的配置类,标注在某个类上,表示这是一个 springboot
的配置类。
我们在这看到 @Configuration
,这个注解我们在 Spring
中就已经看到过了,它的意思就是将一个类标注为 Spring
的配置类,相当于之前 Spring
中的 xml
文件,可以向容器中注入组件。
不是探究重点。
三、@EnableAutoConfiguration
我们来看看这玩意,它的字面意思就是:自动导入配置。
@Inherited @AutoConfigurationPackage ////自动导包 @Import(AutoConfigurationImportSelector.class) ////自动配置导入选择 public @interface EnableAutoConfiguration {}
从这里顾名思义就能猜到这里肯定是跟自动配置有关系的。
我们接着来看看这上面的两个注解 @AutoConfigurationPackage
和 @Import(AutoConfigurationImportSelector.class)
,这两个才是我们研究的重点。
3.1、@AutoConfigurationPackage
点进去一看:
@Inherited @Import(AutoConfigurationPackages.Registrar.class) public @interface AutoConfigurationPackage {}
@Import
为 spring
的注解,导入一个配置文件,在 springboot
中为给容器导入一个组件,而导入的组件由 AutoConfigurationPackages.Registrar.class
执行逻辑来决定的。
往下
加载全部内容