• 初步理解SpringBoot如何实现自动装配


    自动装配

    @SpringBootApplication

    在这里插入图片描述
    说到自动装配就要从@SpringBootApplication注解开始,先看看这个复合注解里面包含了什么。
    在这里插入图片描述

    @EnableAutoConfiguration

    @EnableAutoConfiguration是和我们的自动装配直接有关的注解,再来看看它里面包含了什么东西。
    在这里插入图片描述
    @SpringBootApplication下的@EnableAutoConfiguration注解包含了@AutoConfigurationPackage @Import .

    @AutoConfigurationPackage

    @AutoConfigurationPackage 里面也是一个@Import注解,用来导入Register这个类。
    添加该注解的类所在的包作为 自动配置包 进行管理,扫描springboot所在包 将其配置类交给IOC容器管理。
    在这里插入图片描述

    @EnableAutoConfiguration下的@Import

    @EnableAutoConfiguration@Import导入的是AutoConfigurationImportSelector这个类。
    AutoConfigurationImportSelector这个导入类的作用可以帮助将所有符合条件的@Configuration配置类交给IOC容器进行注入。

    AutoConfigurationImportSelector下部分方法

    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        if (!this.isEnabled(annotationMetadata)) {
            return NO_IMPORTS;
        } else {
            AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(annotationMetadata);
            return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
        }
    }
    
    protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
            if (!this.isEnabled(annotationMetadata)) {
                return EMPTY_ENTRY;
            } else {
                AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
                List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
                configurations = this.removeDuplicates(configurations);
                Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
                this.checkExcludedClasses(configurations, exclusions);
                configurations.removeAll(exclusions);
                configurations = this.getConfigurationClassFilter().filter(configurations);
                this.fireAutoConfigurationImportEvents(configurations, exclusions);
                return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
            }
        }
    
    protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
        //获取META-INF/spring.factories中配置文件中的需要自动装配的类名    
        List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
            Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
            return configurations;
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    1. 利用EnableAutoConfigurationImportSelector给容器中导入一些组件

    2. selectImport方法会返回候选的配置-getCandidateConfigurations

    3. springFactoriesLoader.loaderFactoryNames会扫描Jar包路径下的META-INF/spring.factories,把扫描到的内容包装成properties对象

    4. 从properties对象中获取到有EnableAutoConfiguration.class对应的值,添加进容器

    动手实现自动装配

    在这里插入图片描述
    首先看下目录结构。

    spring.factories

    在此文件里配置好我们的XXXAutoConfiguration类。

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
      com.hodor.limiter.limiterspringbootstarter.HodorLimiterAutoConfiguration
    
    • 1
    • 2

    XXXAutoConfiguration

    @Configuration
    @ComponentScan
    public class HodorLimiterAutoConfiguration {
        @Bean
        public RateLimiterAspect rateLimiterAspect() {
            return new RateLimiterAspect();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    XXXAutoConfiguration就是一个简单的配置类,被@Bean注解的方法的返回值就可以注册进我们的IOC容器了。

  • 相关阅读:
    vsftpd使用
    【网安别学成开发】之——python篇
    iptables防火墙
    1. Django 项目创建
    漫谈AI 时代的信息模型
    TensorFlow和Pytorch两种机器学习框架的比较及优缺点
    PPP协议和HDLC协议
    C++ //练习 9.19 重写上题的程序,用list替代deque。列出程序要做出哪些改变。
    C++ Reference: Standard C++ Library reference: Containers: deque: deque: size
    DDD的哲学意味(上)
  • 原文地址:https://blog.csdn.net/qq_44025894/article/details/125598040