SpringBoot自动装配原理

72 阅读2分钟

一、引导加载自动配置类

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
}

1.SpringBootConfiguration

证明这是一个配置类

2.ComponentScan

指定扫描那些,Spring注解

3.EnableAutoConfiguration

@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
}

3.1 AutoConfigurationPackage

@Import({AutoConfigurationPackages.Registrar.class})
public @interface AutoConfigurationPackage {
   
}

利用Registrar给容器中导入一系列组件:将MainApplication所在包下的组件

3.2 Import({AutoConfigurationImportSelector.class})

1、利用getAutoConfigurationEntry(annotationMetadata);给容器中批量导入一些组件

2、调用List configurations =getCandidateConfigurations(annotationMetadata, attributes)获取到所有需要导入到容器中的配置类

重要3、利用工厂加载 Map<String, List> loadSpringFactories(@Nullable ClassLoader classLoader);得到所有的组件

4、从META-INF/spring.factories位置来加载一个文件。

默认扫描我们当前系统里面所有META-INF/spring.factories位置的文件

spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面也有META-INF/spring.factories

二、按需开启自动配置项

虽然我们127个场景的所有自动配置启动的时候默认全部加载。

xxxxAutoConfiguration按照条件装配规则(@Conditional),最终会按需配置。

三、修改默认配置

SpringBoot默认会在底层配好所有的组件,但是如果用户自己配置,以用户的优先

重要定制化配置的方法:

1.用户直接自定义组件@Bean

2.用户去看这个组件是获取的配置文件什么值就去修改

xxxxAutoConfiguration-->组件-->xxxxProperties里面拿值-->application.properties

四、最佳实践

  • 导入场景依赖 spring-boot-starter-*
  • 查看自动配置项 debug=True
  • 是否需要修改:参照文档修改配置项
  • 自定义加入或者替换组件

五、总结

Spring Boot启动的时候会通过@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中的所有自动配置类,并对其进行加载,而这些自动配置类都是以AutoConfiguration结尾来命名的,它实际上就是一个JavaConfig形式的Spring容器配置类,它能通过以Properties结尾命名的类中取得在全局配置文件中配置的属性如:server.port,而XxxxProperties类是通过@ConfigurationProperties注解与全局配置文件中对应的属性进行绑定的。