Spring @Autowire以奇怪的方式表现为初始化bean返回null

时间:2017-06-08 10:11:56

标签: java spring

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

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

到目前为止一切都很好,但事实证明我的PortfolioServiceImpl实例已经传递了null dateProvider。考虑到我可以清楚地看到dateProvider早先已经实例化,看到这方面的经验令人沮丧。

如果我添加到@Autowired setDateProvider(DateProvider dateProvider)

,我实际上可以让它工作
@Import (EnvironmentConfig.class)
@Config
ReplayConfig{
   @Bean
    DateProvider dateProvider() {
        SystemDateProvider systemDateProvider = new SystemDateProvider (bean());
        return systemDateProvider;
    }
}

我认为这将消除对混淆包或具有相同名称的不同类的可能性的疑问或类似的愚蠢的事情。

我唯一能想到的是别的东西是错的。如果有人可以提出任何想法,那就太好了。

不幸的是,我现在无法摆脱xml的初始化。

以下更多代码:

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());
        }
}

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

{{1}}

1 个答案:

答案 0 :(得分:1)

我猜您可以尝试将dateProvider的bean声明调整为以下值,而不是自动装配AnotherConfig {/ 1}}:

portfolioService