java - Spring @Autowire 的行为方式很奇怪,为初始化的 bean 返回 null

标签 java spring

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

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

到目前为止一切都很好,除了我的 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());
        }
}

最佳答案

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

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

关于java - Spring @Autowire 的行为方式很奇怪,为初始化的 bean 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44432832/

相关文章:

java - MyEclipse 不突出显示匹配元素

spring - spring-data-mongo 文档中的计算字段

java - 使用 Spring 电子邮件抽象层阅读邮件

java - 如果类与客户端一起分发,分布式 RMI 是否可以在没有 HTTP 服务器的情况下实现?

java - 在 Spring Boot 项目中找不到页面

spring - 在 AbstractAuthenticationProcessingFilter 中连接服务以添加身份验证详细信息

java - Spring在运行时选择bean实现

java - 如何创建复合 Action

java - 如何在 Java (NetBeans) 中将禁用按钮的文本颜色更改为黑色?

java - 尽快停止/取消断开连接的 GET 请求线程