解决使用@Component会导致spring.factories中的EnableAutoConfiguration无效问题

 更新时间:2025年03月22日 15:53:23   作者:brucelwl  
这篇文章主要介绍了解决使用@Component会导致spring.factories中的EnableAutoConfiguration无效问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

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

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

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

加上如下两个注解都不会出现被实例化两次的问题

  • 1.@Configuration
  • 2.@Component

但使用@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时虽然能加载到,但是在处理时判断之前实际上已经处理过,所以不再被处理。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 不知道面试会不会问Lambda怎么用(推荐)

    不知道面试会不会问Lambda怎么用(推荐)

    这篇文章主要介绍了Lambda表达式用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • 图解分析Javaweb进程与线程

    图解分析Javaweb进程与线程

    这篇文章主要介绍了Javaweb进程与线程的知识,本篇文章通过简要的案例,讲解了它的基础原理与使用,以下就是详细内容,需要的朋友可以参考下
    2022-03-03
  • Java实现动态数据源切换的实践指南

    Java实现动态数据源切换的实践指南

    在 Java 开发中,许多场景需要访问多个数据库,例如多租户系统或读写分离架构,为了灵活高效地管理这些场景,动态数据源切换技术应运而生,所以本文给大家介绍了Java实现动态数据源切换的实践指南,需要的朋友可以参考下
    2025-03-03
  • Java利用Jackson序列化实现数据脱敏

    Java利用Jackson序列化实现数据脱敏

    这篇文章主要介绍了利用Jackson序列化实现数据脱敏,首先在需要进行脱敏的VO字段上面标注相关脱敏注解,具体实例代码文中给大家介绍的非常详细,需要的朋友可以参考下
    2021-10-10
  • 详解Spring的StringUtils踩坑记录

    详解Spring的StringUtils踩坑记录

    这篇文章主要介绍了详解Spring的StringUtils踩坑记录,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • 一篇文章帮你搞懂什么是java的进程和线程

    一篇文章帮你搞懂什么是java的进程和线程

    这篇文章主要介绍了java 线程详解及线程与进程的区别的相关资料,网上关于java 线程的资料很多,对于进程的资料很是,这里就整理下,需要的朋友可以参考下
    2021-08-08
  • JavaBean实体类处理外键过程解析

    JavaBean实体类处理外键过程解析

    这篇文章主要介绍了JavaBean实体类处理外键过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Java实现简单树结构

    Java实现简单树结构

    这篇文章主要为大家详细介绍了Java实现简单树结构的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • Java多线程环境下死锁模拟

    Java多线程环境下死锁模拟

    这篇文章主要介绍了模拟Java多线程环境下的死锁,文章介绍一些死锁的产生条件的相关资料,具有一定的参考价值,需要的小伙伴可以参考一下,希望对你有所帮助
    2021-12-12
  • java开发AOP面向切面编程入门

    java开发AOP面向切面编程入门

    这篇文章主要介绍了java开发的AOP面向切面编程入门的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步学有所得
    2021-10-10

最新评论