我有一个遗留的 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/