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

总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
SpringBoot利用自定义注解实现隐私数据脱敏(加密显示)的解决方案
这两天在整改等保测出的问题,里面有一个“用户信息泄露”的风险项(就是后台系统里用户的一些隐私数据直接明文显示了),其实指的就是要做数据脱敏,本文给大家介绍了SpringBoot利用自定义注解实现隐私数据脱敏(加密显示)的解决方案,需要的朋友可以参考下2023-11-11
SpringBoot项目没有把依赖的jar包一起打包的问题解决
这篇文章主要介绍了SpringBoot项目没有把依赖的jar包一起打包的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下2019-09-09


最新评论