【深入浅出SpringBoot的核心原理】自动装配原理

SpringBoot是Spring的包装,通过自动配置使得SpringBoot可以做到开箱即用,上手成本非常低,但是学习其实现原理的成本大大增加,需要先了解熟悉Spring原理。本篇主要分析SpringBoot的自动配置原理。
Spring Boot 的开启注解是:@SpringBootApplication,由下面的代码可知。

@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}
)}
)

主要又由以下三个注解组成
@SpringBootConfiguration
@ComponentScan
@EnableAutoConfiguration
上面三个注解,@ComponentScan由于没有指定扫描包,因此它默认扫描的是与该类同级的类或者同级包下的所有类;@SpringBootConfiguration,通过源码得知它是一个@Configuration;而 Spring Boot 最最核心的就是这个 @EnableAutoConfiguration 注解了,它能根据类路径下的 jar 包和配置动态加载配置和注入bean。

@Target({
    
    ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({
    
    AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
    
    
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

    Class<?>[] exclude() default {
    
    };

    String[] excludeName() default {
    
    };
}

@EnableAutoConfiguration注解,它会去找到AutoCofigurationImportSelector根据这个 spring.autoconfigure.exclude目录,找到spring -boot-autoconfigure.jar,然后激活 spring -boot-autoconfigure.jar这个jar 下的 META-INF/spring.factories这个东西的
里面全是这样的结构,k-v结构的方式
在这里插入图片描述
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\点击就会找到这个实现类

在这里插入图片描述

  1. @Import理解
    等价于 xml配置的 <import resource …/>
    import 就是将多个分开的配置合并在一个配置中。与在JavaConfig 中该注解所表达的意义是一样的。
    @Import可以配置三种不同的 class
  2. ImportSelector理解
    上面的代码@Import({AutoConfigurationImportSelector.class}),是因为AutoConfigurationImportSelector实现了importSelector接口,其实现借助了Spring 框架提供的一个工具类 SpringFactoriesLoader 的支持,以及用到了 Spring 提供的条件注解@ConditionalOnXXXXX(*.class) 等同于spring-autoconfiguration-metadata.properties 中的条件 XXX.ConditionalOnMissingClass=,和过滤‘exclude’ 选择性的针对需要加载的 bean 进行条件过滤
    3.AutoConfigurationImportSelector 理解
    会先扫描 spring-autoconfiguration-metadata.properties文件,最后在扫描 spring.factories 对应的类时,会结合前面的元数据进行过滤,为什么要过滤呢? 原因是很多的@Configuration 其实是依托于其他的框架来加载的,如果当前的 classpath 环境下没有相关联的依赖,则意味着这些类没必要进行加载,所以,通过这种条件过滤可以有效的减少@configuration 类的数量从而降低SpringBoot 的启动时间

三、总结
  1)自动装配还是利用了SpringFactoriesLoader来加载META-INF/spring.factoires文件里所有配置的EnableAutoConfgruation,它会经过exclude和filter等操作,最终确定要装配的类

2) 处理@Configuration的核心还是ConfigurationClassPostProcessor,这个类实现了BeanFactoryPostProcessor, 因此当AbstractApplicationContext执行refresh方法里的invokeBeanFactoryPostProcessors(beanFactory)方法时会执行自动装配

猜你喜欢

转载自blog.csdn.net/qq_35529931/article/details/106988758