簡體   English   中英

Spring @Autowire以一種奇怪的方式運行,為初始化的bean返回null

[英]Spring @Autowire is behaving in a weird way returning null for initialized bean

我有一個傳統的Spring應用程序,混合了xml和java config。 (對不起,我沒有選擇)。 spring上下文是從xml配置初始化的,該配置具有掃描Java配置的組件掃描指令。

有很多Java配置類,下面是其中2個出現問題的代碼段。 我的@Bean DateProvider dateProvider() ReplayConfig被初始化,我可以通過在構造函數中放置一個斷點來看到這一點。 然后在AnotherConfig我自動裝配@Autowired private DateProvider dateProvider; 使用@Import(ReplayConfig.class)

所有好為止,除了事實證明我的實例portfolioService已經通過空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());
        }
}

我想,而不是自動裝配的dateProviderAnotherConfig你可以嘗試的bean聲明調整portfolioService下列之一:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM