Spring Boot自动装配(一)

Spring Boot自动装配(一)

注:基于SpringBoot2.x版本以上

@EnableAutoConfiguration

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

​ 其中AutoConfigurationImportSelector就是具体自动装配的实现类,实现了DeferredImportSelector接口,具体的实现逻辑均在**selectImports(****)**方法中。

public String[] selectImports(AnnotationMetadata annotationMetadata) {
   
    if (!this.isEnabled(annotationMetadata)) {
   
        return NO_IMPORTS;
    } else {
   
      	//加载自动装配的元信息。
        AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);
      	//获取@EnableAutoConfiguration标注类的元信息。
        AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
      	//获取自动装配类的候选类名称。
        List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
      	//去重,排除重复的configurations(为什么会重复呢?)
        configurations = this.removeDuplicates(configurations);
      	//获取自动装配组件的排除名单。
        Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
      	//检查排除类是否合法
        this.checkExcludedClasses(configurations, exclusions);
      	//移除所有的排除名单
        configurations.removeAll(exclusions);
      	//进行过滤,autoConfigurationMetadata充当过滤条件。
        configurations = this.filter(configurations, autoConfigurationMetadata);
      	//自动装配的导入事件
        this.fireAutoConfigurationImportEvents(configurations, exclusions);
        return StringUtils.toStringArray(configurations);
    }
}

疑问:

  • 如何装配组件,装配哪些组件?
  • 如何排除组件?

从所有的方法,一步步的分析。

AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);

public static AutoConfigurationMetadata loadMetadata(ClassLoader classLoader) {
   
    return loadMetadata(classLoader, "META-INF/spring-autoconfigure-metadata.properties");
}

可以从代码中看到,它加载的是spring-autoconfigure-metadata.properties

由于文件内容过多,这里仅贴了部分。

org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration=
org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration.AutoConfigureAfter=org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration
org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveDataAutoConfiguration.Configuration=
org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveDataAutoConfiguration.ConditionalOnClass=com.datastax.driver.core.Cluster,org.springframework.data.cassandra.core.ReactiveCassandraTemplate,reactor.core.publisher.Flux
org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration.ConditionalOnClass=org.apache.solr.client.solrj.SolrClient,org.springframework.data.solr.repository.SolrRepository
org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration=
org.springframework.boot.autoconfigure.reactor.core.ReactorCoreAutoConfiguration=
org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration.Configuration=
org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration.AutoConfigureBefore=org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration
org.springframework.boot.autoconfigure.jms.artemis.ArtemisXAConnectionFactoryConfiguration=
org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration.Configuration=
org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration=
static AutoConfigurationMetadata loadMetadata(ClassLoader classLoader, String path) {
   
    try {
   
        Enumeration<URL> urls = classLoader != null ? classLoader.getResources(path) : ClassLoader.getSystemResources(path);
        Properties properties = new Properties();

        while(urls.hasMoreElements()) <
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值