栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

文章目录
  • 自动装配
    • @SpringBootApplication
      • @EnableAutoConfiguration
        • @AutoConfigurationPackage
        • @EnableAutoConfiguration下的@Import
    • 动手实现自动装配
      • spring.factories
      • XXXAutoConfiguration

自动装配 @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 configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
            configurations = this.removeDuplicates(configurations);
            Set 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 getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
    //获取META-INF/spring.factories中配置文件中的需要自动装配的类名    
    List 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. 利用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
XXXAutoConfiguration
@Configuration
@ComponentScan
public class HodorLimiterAutoConfiguration {
    @Bean
    public RateLimiterAspect rateLimiterAspect() {
        return new RateLimiterAspect();
    }
}

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1006014.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号