spring - 为什么spring bean构造函数解析逻辑改变了
问题描述
从 Spring 5.2.9.RELEASE 切换到 Spring Boot 2.4.7(Spring 5.3.8)时,我发现了一个令人失望的惊喜。例如具有以下组件:
@Component
public class MyService {
private Bean1 bean1; //declared as @Component
private Bean2 bean2; //declared as @Component
public MyService(Bean1 bean1, Bean2 bean2) {
this.bean1 = bean1;
this.bean2 = bean2;
}
protected MyService() {}
}
在 Spring 5.2.9 中,MyService 组件是使用带参数的构造函数初始化的,现在在 Spring 5.3.8 中调用了空构造函数,并且运行时令我惊讶 bean1 和 bean2 为空。
这背后有什么逻辑吗?以及如何获得以前的行为,因为我不想通过代码和搜索任何人为测试创建空构造函数并使用@Autowired 标记为必需的..?
经过调查,看起来原因是Spring如何初始化上下文。使用纯弹簧,我有基于 XML 的配置:
<beans ..
default-autowire="constructor">
<context:component-scan base-package="com..."/>
Spring 采用了带参数的构造函数的影响是:default-autowire="constructor"。删除时使用默认构造函数。
迁移到 Spring Boot 之后,所有基于 XML 的配置都被留下了,包括这个。但这不再起作用了......
@ImportResource("classpath:app-config.xml")
public class Application extends SpringBootServletInitializer {
解决方案
推荐阅读
- python - 将宽数据集转换为具有多列的长格式
- c++ - C++17:内存分配/释放顺序的奇怪行为
- python - 在 pandas 数据框中找到重复值时分配给以前的值
- amazon-ec2 - 如何连接 EC2 实例?
- gnuplot - 对于某些标题字符串,在 gnuplot 中绘制标题未对齐?
- apache-spark - 如何检查包含数组的列是否等于我们在 Spark DataFrame 中提供的另一个数组?
- java - 从 Windows cmd.exe 运行 java.exe
- openacc - 错误:无法计算目标文件的后缀:在构建 GCC 10 并卸载 OpenACC 支持到 Nvidia GPU 时无法编译
- javascript - HTML/javascript 在线实验 - 不同浏览器的视频速度不同(在 safari 中太快,在 chrome 中可以)
- java - 方法中的参数, Object... VS Object[] ,这两者是否具有相同的功能?