9,自动配置原理

通过文章6,7,8大概就能知道Spring Boot的自动配置原理和Spring Boot重要核心-自动配置,

我们在pom中引入依赖,会自动注册一些类和方法到项目中,依据引入spring-boot-starter-web依赖,

启动类注解:

@SpringBootApplication

按CTRL—鼠标左键,进入注解类

@SpringBootConfiguration
@EnableAutoConfiguration

    @SpringBootConfiguration包含:证明启动类也是一个配置类

@Configuration

    @EnableAutoConfiguration包含:文章7中,我们用到过 ImportSelector 类,这个类会被Spring Boot 自动调用

@Import({AutoConfigurationImportSelector.class})

继续进入AutoConfigurationImportSelector 类中,实现 DeferredImportSelector 类

实现方法

public String[] selectImports(AnnotationMetadata annotationMetadata) {
    if (!this.isEnabled(annotationMetadata)) {
        return NO_IMPORTS;
    } else {
        AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(annotationMetadata);
        return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
    }
}

返回的结果集是:autoConfigurationEntry.getConfigurations()

结果集是从:this.getAutoConfigurationEntry(annotationMetadata)这个方法来,进入方法

protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
   if (!isEnabled(annotationMetadata)) {
      return EMPTY_ENTRY;
   }
   AnnotationAttributes attributes = getAttributes(annotationMetadata);
   List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
   configurations = removeDuplicates(configurations);
   Set<String> exclusions = getExclusions(annotationMetadata, attributes);
   checkExcludedClasses(configurations, exclusions);
   configurations.removeAll(exclusions);
   configurations = getConfigurationClassFilter().filter(configurations);
   fireAutoConfigurationImportEvents(configurations, exclusions);
   return new AutoConfigurationEntry(configurations, exclusions);
}

而返回的类里,configurations是通过getCandidateConfigurations(annotationMetadata, attributes)方法,再继续进入方法

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
   ImportCandidates importCandidates = ImportCandidates.load(this.autoConfigurationAnnotation,
         getBeanClassLoader());
   List<String> configurations = importCandidates.getCandidates();
   Assert.notEmpty(configurations,
         "No auto configuration classes found in " + "META-INF/spring/"
               + this.autoConfigurationAnnotation.getName() + ".imports. If you "
               + "are using a custom packaging, make sure that file is correct.");
   return configurations;
}

这个类就已经能看到,和我们在第七章中的配置文件加载类方法相同了,打断点测试,能看到this.autoConfigurationAnnotation,这个路径值

在右侧找到对应的包,能看到加载的内容,和配置文件的内容相同,自此,SpringBoot的自动配置原理已经搞清楚了,

希望能自己手动找一遍,印象会更深刻

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值