繁体   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