我有一个@Configuration
bean,用于定义Java中的各种bean
@Configuration
public class jmsConfiguration {
// Various @Bean definitions
}
我也有下面的豆子:
@Component
@Profile({"BATCH_MODE"})
public class BatchLauncher {
@Autowired
private Launcher launcher;
@PostConstruct
public void init(){
launcher.launch();
// The launcher bean encapsulates the logic to
// get the Spring Batch JobLauncher bean,
// build the job parameters and start the job
}
}
问题在于:
获取init()
bean并启动批处理作业的Launcher
方法在 @Configuration
类初始化之前称为。
如果代码launcher.launch()
被注释掉并且应用程序在调试中运行,则调试器将停止在构造各种@Bean
的代码中。但是,当launcher.launch()
存在且运行时,该代码将首先运行,这意味着ItemWriter
所依赖的bean尚未正确初始化。
这是用于启动Spring上下文的代码:
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();
ctx.load("app-context.xml");
ctx.getEnvironment().getPropertySources().addLast(propertySource);
ctx.refresh();
ctx.start();
这就是用XML定义Launcher bean的方法:
<context:component-scan base-package="com.company.app" />
<beans>
<bean id="launcher" class="com.company.Launcher" />
...
</beans>
解决这个问题的最佳方法是什么?
由于
答案 0 :(得分:0)
您可以在BatchLauncher类上使用DependsOn批注来定义类所依赖的bean,如果它们不是作为构造函数参数或自动装配的字段放置的。