SpringBoot 的自动配置原理

73 阅读3分钟

一、什么是 SpringBoot 自动装配

SpringBoot 会根据类路径中的 jar包、类,为 jar 包里的类进行自动配置,这样就可以大大的减少配置的数量。

简单点说,就是 SpringBoot 会根据定义在 classpath 下的类,自动给你生成一些 Bean,并且加载到 Spring 的 Context 中。

SpringBoot 是如何实现自动装配的,先看一个大概步骤:

  1. 组件扫描(Component Scanning) :Spring Boot 使用组件扫描来查找和注册标有特定注解的 bean。默认情况下,Spring Boot 将扫描主应用程序类所在的包及其子包下的所有类。标有 @Component@Service@Repository@Controller 注解的类将被注册为 bean。
  2. 条件化的 bean 注册(Conditional Bean Registration) :Spring Boot 使用条件化的 bean 注册来根据条件自动注册特定的 bean。这些条件可以基于环境属性、系统属性、类路径是否包含特定类等。当条件满足时,相应的 bean 将被注册到 Spring 的应用程序上下文中。
  3. 自动配置(Auto-Configuration) :Spring Boot 基于类路径中的 jar 包和已配置的条件自动配置应用程序上下文。Spring Boot 提供了大量的自动配置类,这些类负责根据条件注册特定的 bean,以及设置应用程序的默认配置。这样,开发人员就无需手动配置大部分常见的 bean 和配置,而是可以依赖于 Spring Boot 的自动配置。

二、SpringBootApplication 注解

在Spring Boot项目中的引导类上有一个注解@SpringBootApplication,这个注解是对三个注解进行了封装,分别是:

  • @SpringBootConfiguration 等同于 Configuration,标记为配置类,加载到容器中
  • @EnableAutoConfiguration启该注解用于启用 Spring Boot 的自动配置功能。它会根据应用程序的依赖关系和当前环境,自动注册所需的 bean。
  • @ComponentScan :配置扫描路径,用来加载 bean。该注解用于启用组件扫描,以便 Spring Boot 可以自动发现和注册标有 @Component@Service@Repository@Controller 注解的类。


其中@EnableAutoConfiguration是实现自动化配置的核心注解。

该注解通过 @Import注解导入对应的配置选择器。 AutoConfigurationImportSelector 类对所有符合配置的Configuration都进行加载。内部就是读取了【该项目和该项目引用的 Jar 包】的 classpath 路径下META-INF/spring.factories文件中的所配置的类的全类名。

可以看出,AutoConfigurationImportSelector 类实现了 ImportSelector接口,也就实现了这个接口中的 selectImports方法,该方法主要用于获取所有符合条件的类的全限定类名,这些类需要被加载到 IoC 容器中。


在这些配置类中所定义的Bean会根据条件注解所指定的条件来决定是否需要将其导入到 Spring 容器中。

条件判断会有像@ConditionalOnClass这样的注解,判断是否有对应的 class 文件,如果有则加载该类,把这个配置类的所有的 Bean 放入 spring 容器中使用。

三、自动装配的关键技术

  1. 引入starter,启动依赖组件的时候,组件里面必须包含一个@Confinguration配置类,在这个配置类里面,我们需要通过@Bean这个注解去声明需要装配到IOC容器里面的Bean对象。
  2. 这个配置类是放在第三方jar包里面,然后通过SpringBoot种约定优于配置,去把这个配置类的全路径,放在classpath:/META-NF/spring·factories文件里面,SpriingBoot就可以知道第三方jar包里面这个配置类的位置,这个步骤主要是用到了Spring里面的SpringFactoriesloader来完成的
  3. SpringBoot拿到所有第三方jar包里面声明的配置类以后,再通过Spring提供ImportSelector这样一个接口,来实现对这些配置类的动态加载,从而完成自动装配