SpringBoot源码分析----SpringBoot自动配置

Posted Tom

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot源码分析----SpringBoot自动配置相关的知识,希望对你有一定的参考价值。

前言

springboot项目将模块化设计发挥到及至,需要什么模块,只需导入这个模块对应的stater即可,当然,用户根据业务需要自定义相关的stater,关于自定义stater在后续章节将一一解说,学习springboot,首要了解springboot的自动配置原理,我们从springboot项目的主启动类说起逐步解读springboot自动配置的奥秘。

springboot自动配置解读

@SpringBootApplication
public class SpringBootQuickApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootQuickApplication.class, args);
    }

}

 如上所示,@SpringBootApplication 注解标注在springboot应用的主启动类上,如下所示,@SpringBootApplication  其为复合注解,主要分析@SpringBootConfiguration  @EnableAutoConfiguration 这两个注解代表的含义

1.  @SpringBootConfiguration 

 

@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 {

 

 @SpringBootConfiguration  标识在某个类上表示这个类为springboot的配置类,@Configuration 为 spring 定义的配置类注解,@SpringBootConfiguration为springboot定义的配置类注解,深入@Configuration 可以看到其为 spring 容器中的一个组件 

提示:配置类是为了替换配置文件而生的,配置类也为容器中的一个组件  @Component

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {


@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {

 2. @EnableAutoConfiguration

springboot中为我们自动配置好了许多东西,@EnableAutoConfiguration 告诉 springboot 开启自动配置,这样自动配置才能生效
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {

 注解 @AutoConfigurationPackage    @Import({AutoConfigurationImportSelector.class})  给容器中导入组件

① 、@AutoConfigurationPackage 自动配置包

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

 @Import 为spring的底层注解,给容器中导入一个组件

由注册器 Register 给springboot中注入组件,
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
        Registrar() {
        }
    //注册 bean 定义     //将主配置类(@SpringBootApplication标注的类)所在的包及下面子包里面的所有组件扫描到 spring 容器当中 public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) { AutoConfigurationPackages.register(registry, (new AutoConfigurationPackages.PackageImport(metadata)).getPackageName()); }




总结: 可以看出,通过 @AutoConfigurationPackage 注解将自定义的组件扫描到 spring 容器当中

 ②、@Import({AutoConfigurationImportSelector.class}) 

  给容器中导组件?

  导入那些组件?

  AutoConfigurationImportSelector 导入哪些组件的选择器

  将所需要的组件以全类名的方式返回,这些组件将加入到spring容器当中

给容器当中导入非常多的配置类(XXXAutoConfiguration)   ,给容器中导入这个场景所需要的所有组件并配置好这些组件

 

 

 

 

 

 

有了这些自动配置,免去了我们手动编写配置注入功能组件的工作
SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class, this.getBeanClassLoader());
SpringBoot在启动的时候从类路径下的 MATE-INF/spring.factories中获取 EnableAutoConfiguration 指定的值,将这些值作为自动配置类导入到容器当中,
自动配置类就生效,就可以帮助我们自动配置工作,以前我们自己需要配置的东西springboot帮我们做了

Javaee 整体解决方案和自动配置都在这个包里面 spring-boot-autoconfigure-2.2.5.RELEASE.jar

以上是关于SpringBoot源码分析----SpringBoot自动配置的主要内容,如果未能解决你的问题,请参考以下文章

spring boot 2.1.7启动过程源码解析

spring boot 2.1.7启动过程源码解析

Spring全家桶:Spring,SpringBoot,SpringCloud实战,Spring源码

SpringBoot - 使用Assert校验让业务代码更简洁

如何分析SpringBoot源码模块及结构?--SpringBoot源码

211期Tomcat 在 SpringBoot 中是如何启动的?