本篇文章将SpringBoot的自动配置原理进行详细解析。
pom文件
SpringBoot 父项目
在pom.xml中引入parent父项目,相当于java中的继承,做了大量的依赖版本控制,自动导入对应的版本依赖,避免出现因版本不对应而发生问题的情况。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>xxx</version>
</parent>
父项目的父项目:用于管理版本号
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>xxx</version>
<relativePath>../../spring-boot-dependencies</relativePath>
</parent>
spring-boot-dependencies 依赖中定义了Boot项目常用的依赖;
可以理解为 SpringBoot 的版本控制中心,以后导入依赖默认是不需要写版本的。
场景启动器
配置自动配置还需要导入场景启动器的依赖,才能自动注入到spring容器中。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-xxx</artifactId>
</dependency>
启动类
用于导入Spring的144个组件(Boot环境需要的组件)和导入个人的组件。
package com.soft;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* 通过Main函数去启动SpringBoot应用
* @SpringBootApplication
* 标识这是一个SpringBoot的应用
**/
@SpringBootApplication
public class Application {
public static void main(String[] args) {
// 要启动Spring应用
// 参数1: @SpringBootApplication所在类的类对象
// 参数2: main函数的参数
SpringApplication.run(Application.class, args);
}
}
@SpringBootApplication:
标注在类上,说明这个类是SpringBoot的主配置类,SpringBoot要运行这个类的main方法来启动Spring应用。
@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 {
}
SpringBoot的核心注解是@SpringBootApplication,它也是启动类的注解,并包含了三个注解:
@SpringBootConfiguration:组合了@Configuration注解,来实现配置文件的功能。
@EnableAutoConfiguration:具有打开自动配置的功能,也可以关闭某个自动配置的选项。
@ComponentScan:用于Spring组件的扫描。
@SpringBootConfiguration:
标注在类上,表明这个类是SpringBoot的配置类,把当前类注入到Spring容器中,也能在启动类上引入一些配置。
@Configuration:标注在类上,表示这个类是一个配置类;用于替换配置文件。
@Component:由于配置类也是容器的一个组件,所以需要添加该注解进行管理。
@EnableAutoConfiguration:
开启自动配置功能。以前需要手动配置的功能,现在都不需要配置,由SpringBoot自动配置注入到容器中可以直接使用。里面还有@AutoConfigurationPackage、@Import(AutoConfigurationImportSelector.class)两大关键点。
@AutoConfigurationPackage:自动配置包(当前项目中自己编写的内容)
@Import(AutoConfigurationPackages.Register.class):Spring的底层注解,用于给容器导入组件,由Register.class控制。
将主配置类(@SpringBootApplication注解标注的类)所在包及子包下的所有组件扫描到Spring容器中。
/**
* {@link ImportBeanDefinitionRegistrar} to store the base package from the importing
* configuration.
*/
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
register(registry, new PackageImports(metadata).getPackageNames().toArray(new String[0]));
}
@Override
public Set<Object> determineImports(AnnotationMetadata metadata) {
return Collections.singleton(new PackageImports(metadata));
}
}
@Import(AutoConfigurationImportSelector.class):
给容器中导入已经扫描到的组件(Spring自身的组件)
AutoConfigurationImportSelector:自动配置导入的扫描器,将所需要的组件以全类名数组的方式返回,组件就会添加到容器中。会给容器中导入很多配置类(xxxAutoConfiguration),就是给容器中导入场景需要的所有组件并配置好这些组件。
SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader())
老版本:
SpringBoot 在启动时从类路径下的/META-INF/spring.factories
中获取EnableAutoConfiguration
指定的值(类全限定名),将这些值对应的类导入到spring容器中,就可以帮助完成自动配置工作。(spring-boot-autoconfigure-xxx.jar)
新版本:
SpringBoot 在启动时从类路径下的spring-boot-autoconfigure-x.x.x.jar/META-INF/spring/xxxx.imports
中读取每一行配置的自动注入类的全限定名称。
什么是SpringBoot的Starter?
Starters可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,可以一站式集成Spring和其他技术,而不需要到处找示例代码和依赖包。Spring Boot Starter的工作原理:Spring Boot在启动时扫描项目所依赖的Jar包,寻找包含spring.factories文件的jar包,根据spring.fatories配置加载AutoConfigure类,根据@Conditional注解的条件,进行自动配置并将Bean注入到Spring Context;
总而言之:
SpringBoot的自动配置是基于Spring框架提供的条件注解机制实现的。当SpringBoot应用启动的时候,会根据应用的依赖和配置信息,自动选择和配置相应的Bean,SpringBoot的自动配置是基于以下条件注解实现的:
@ConditionalOnBean:当指定的Bean存在的时候,才会进行自动配置。 @ConditionalOnMissingBean:当指定的Bean不存在的时候,才会进行自动配置。@ConditionalOnClass:当指定的类存在时,才会进行自动配置。@ConditionalOnProperty:当指定的属性满足指定条件时,才会进行自动配置。@ConditionalOnWebApplication:当应用是一个Web应用时,才会进行自动配置。
Spring Boot通过这些条件注解实现了自动配置。当应用启动时,Spring Boot会根据类路径下的META-INF/spring.factories文件中的配置,加载自动配置类,并根据上述条件注解来判断是否执行自动配置过程,从而实现自动配置。
Spring Boot的自动配置是Spring Boot框架的重要特性之一。它通过条件注解机制来根据依赖和配置信息自动选择和配置相应的Bean,让我们不需要过多的配置就能使用各种常见的功能和特性。在日常开发中,使用Spring Boot的自动配置可以大大提升开发效率,减少冗余的配置工作。