SpringBoot如何实现的自动装配
1. 基本描述
SpringBoot的最主要的功能就是自动装配功能。通过自动配置,SpringBoot大大减少了使用java框架的复杂程度,并且可以统一的将配置文件写入application.yml中。并且,SpringBoot为常见的应用提供了一套默认的配置,使得使用者无需编写重复的配置代码,可以专心于业务的实现。
第三方框架和其他的Spring组件只要使用Spring提供的SPI规范,就可以通过编写starter的方式被通过SpringBoot的方式组合到SpringBoot中。
SpringBoot首先会从配置文件中读取所有的自动配置类,这些配置类我们称为待选配置类。然后通过筛选,仅注入项目所需要的配置类,这些配置类被注册后就会生效,为我们的项目提供自动配置功能。
2. 原理和实现
2.1 配置的读取和筛选
SpringBoot实现自动装配的主要实现是依靠@EnableAutoConfiguration注解实现的,这个注解被包含在了Spring的入口注解@SpringBootApplication中
@SpringBootApplication
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {
@Filter(
type = FilterType.CUSTOM,
classes = {
TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {
AutoConfigurationExcludeFilter.class}
)}
SpringBootApplication注解包括三个重要的子注解
- @SpringBootConfiguration 是一个对 @Configuration 的包装,其加入了一个 @Index 注解作为对SpringBoot应用加速的注解。
- @ComponentScan注解是SpringBoot的组件扫描注解。
- 主要实现自动配置的注解是 @EnableAutoConfiguration注解
@EnableAutoConfiguration注解的实现如下:
@AutoConfigurationPackage
@Import({
AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {
};
String[] excludeName() default {
};
}
可以看到,在这里SpringBoot引用了AutoConfigurationImportSelector类,这个类继承了ImportSelector接口,这个接口提供一个方法,可以在获取到IOC容器中的Bean的元信息之后,来判断是否将Bean注入IOC容器。这个方法就是selectImports方法。参数为AnnotationMeataInfo注解元信息。
public String[] selectImports(