首页 > 解决方案 > 为什么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 {

标签: springspring-boot

解决方案


推荐阅读