导语
Spring Boot最为核心的功能就是自动配置,所有功能的实现都是基于“约定优于配置”的原则,但是Spring Boot是如何实现自动配置的功能的,下面就通过源码学习Spring Boot的核心运作原理,内容包括自动配置的运作原理、核心功能模块、核心注解以及使用到的核心代码分析等等的内容。
文章目录
核心运行原理
使用Spring Boot的时候,通过引入对应场景的Starter,被称为场景启动器,再Spring Boot项目启动的时候会自动加载相关的依赖,添加相应的默认配置。通过最简单的方式来完成对于第三方组件的集成操作,这个就是Spring Boot自动配置的核心的思想。如下图所示,图例来源某电子书截图
上图描述了再Spring Boot自动配置功能实现的过程中涉及到的几个核心实现功能之间的逻辑关系图。主要包括的就是@EnableAutoConfiguration注解,spring.factories配置 自动配置的条件判断,以及Starter场景启动器的其他依赖配置。
Spring Boot通过@EnableAutoConfiguration注解来开启自动配置,通过加载spring.factories中配置的配置的自动配置类,当某个AutoConfiguration类满足@Conditional所指定的生效条件的时候,就可以实例化对应的的AutoConfiguration类中所定义的@Bean组件,并且注入到容器中,这样就可以再整个的项目中使用对应的功能了。也就完成了自动配置。
下面来分开说明一下对应的内容
- @EnableAutoConfiguration;该注解由组合注解@SpringBootApplication引入,完成自动配置开启,扫描各个包下的spring.factories文件,并加载文件中注入的自动配置类,当然自定义的场景启动器也是通过这种方式进行加载。
- spring.factories;配置文件,位于jar包的META-INF目录下,按照指定格式注册了自动配置的AutoConfiguration类,spring.factories也可以包含其他类型的需要注册的类。该文件不仅存在于Spring Boot的项目中,当然也可以存在于自定义的场景启动器Starter中。
- AutoConfiguration类;自动配置类,代表了Spring Boot 中的一类配置类,再这些配置类中定义了第三方需要使用的Bean的初始化以及初始化的条件。
- @Conditional;条件注解,这个是Spring提供的注解,通过这个注解也衍生了很多的其他注解。表示满足定义的条件的时候才会被实例化成Spring 容器中的Bean对象。
- Starter;场景启动器,第三方组件的自动配置依赖启动器,默认将满足某一使用场景的第三方配置全部包含到其中,再使用的时候直接引用对应的starter就可以实现对于某个场景的快速实现。
运作原理源码解析之@EnableAutoConfiguration
@EnableAutoConfiguration是开启自动配置的注解,在创建的Spring Boot项目中并不能直接看到这个注解,它是通过组合注解@SpringBootApplication引入的。所以要想了解这个注解需要先对@SpringBootApplication注解来进行了解一下,然后再深入的了解@EnableAutoConfiguration注解的作用。
入口类和@EnableAutoConfiguration注解
Spring Boot项目需要创建一个启动类,这个启动类上面需要标注一个注解@SpringBootApplication,表示启用了SpringBoot自动配置方式。
@SpringBootApplication
public class MainApplication
{
public static void main(String[] args)
{
SpringApplication.run(RuoYiApplication.class, args);
}
}
这里main方法没有其他的意思,就是再程序启动的时候需要一个主入口文件,这个是每个程序启动必须的内容。会看到这个类上就标注了@SpringBootApplication注解。下面就来看看这个注解,源码如下,当然源码上有很多的注释,博主将这些注释都删除了加上博主自己的注释
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
/**
* 排除一个指定的自动注解类,并且这个类将不再被自动注解体系注入到容器中。
*/
@AliasFor(annotation = EnableAutoConfiguration.class)
Class<?>[] exclude() default