我有一个传统的Spring应用程序,混合了xml和java config。 (对不起,我没有选择)。 spring上下文是从xml配置初始化的,该配置具有扫描Java配置的组件扫描指令。

有很多Java配置类,下面是其中2个出现问题的代码片段。
我的@Bean DateProvider dateProvider()中的ReplayConfig首先被初始化,我可以通过在构造函数中放置一个断点来看到这一点。然后在AnotherConfig中使用@Autowired private DateProvider dateProvider;后自动连接@Import(ReplayConfig.class)

到目前为止一切都很好,除了事实证明我的portfolioService实例已经传递了一个null dateProvider。鉴于我能清楚地看到dateProvider早已实例化,因此看到这种体验令人沮丧。

如果我添加到PortfolioServiceImpl,实际上可以使它正常工作

@Autowired setDateProvider(DateProvider dateProvider)


我认为这将消除所有可能混淆具有相同名称或类似之类的软件包或不同类的可能性的疑问。

我唯一想到的是其他错误。如果有人可以提出任何想法,那就太好了。

不幸的是,我暂时无法摆脱xml初始化。

下面的更多代码:

@Import (EnvironmentConfig.class)
@Config
ReplayConfig{
   @Bean
    DateProvider dateProvider() {
        SystemDateProvider systemDateProvider = new SystemDateProvider (bean());
        return systemDateProvider;
    }
}


然后,我们导入该文件并尝试自动连接dateProvider

 @Import(ReplayConfig.class)
    @Configuration
    public class AnotherConfig {
        @Autowired
        private DateProvider dateProvider;

        @Bean
        PortfolioService portfolioService() {
            PortfolioService  portfolioService = new PortfolioServiceImpl(dateProvider, bean(),otherBean());
            return portfolioService
        }
    }


这是我们触发组件扫描的方式:

<!--******************************************  Scan for JavaConfig  ******************************************-->
<context:component-scan base-package="com.app.config, com.app.common.config">
         <context:exclude-filter type="regex" expression="com\.app\.a4\.systest.*"/>
         <context:exclude-filter type="regex" expression="com\.app\.common\.systest.*"/>
</context:component-scan>


这是我们启动应用程序并创建上下文的方法:

public static void main(String[] args) {

        try(ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(getResourcePath())){
            context.setClassLoader(Thread.currentThread().getContextClassLoader());
        }
}

最佳答案

我想不是将dateProvider自动装配到AnotherConfig,而是可以尝试将portfolioService的bean声明调整为以下内容:

@Bean
PortfolioService portfolioService(DateProvider dateProvider) {
    PortfolioService  portfolioService = new PortfolioServiceImpl(dateProvider, bean(),otherBean());
    return portfolioService
}

10-04 13:40