使用@Component会导致spring.factories中的EnableAutoConfiguration无效

本文基于SpringBoot 2.6.0分析,(但实际上目前所有版本都存在这个问题),使用@Component会导致spring.factories中的EnableAutoConfiguration无效

在spring.factories中通过org.springframework.boot.autoconfigure.EnableAutoConfiguration配置自动装配类时,bean名称是全类名。

  1. 加上如下两个注解都不会出现被实例化两次的问题: @Configuration, @Component

  2. 但使用@Component注解会导致在spring.factories中配置的无效,bean名称变为类名首字母小写,而@Configuration不会,

    原因是在做类路径bean扫描时,会过滤掉含@Configuration并配置在spring.factories中的类,参见:org.springframework.boot.autoconfigure.AutoConfigurationExcludeFilter,由AutoConfigurationImportSelector去加载.

@Configuration
//@Component
public class MyCustomAutoConfiguration {

    public MyCustomAutoConfiguration() {
        System.out.println(MyCustomAutoConfiguration.class.getName() + " init...");
    }
}

为什么类上标记@Component会导致其在spring.factories中配置无效 ???

原因在于Spring执行包扫描的时候,会将扫描的类包装成ConfigurationClass进行解析,解析之前会从Map(ConfigurationClassParser#configurationClasses)中获取判断之前是否已经解析过,如果已经解析过则跳过,解析之后会存放到Map中保存。当使用@Component会被Spring扫描到, 之后AutoConfigurationImportSelector加载spring.factories中的EnableAutoConfiguration时虽然能加载到,但是在处理时判断之前实际上已经处理过,所以不再被处理。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值