У меня есть пружинное веб-приложение, которое регистрирует несколько пакетных заданий пружины для длительной фоновой обработки во время запуска. Насколько я могу судить, контексты Spring-Batch не знают о синглетах, объявленных в корневом bean-компоненте AnnotationConfigWebApplicationContext, поэтому для каждой работы создается несколько копий сложных для инициализации компонентов как при начальной загрузке приложения, так и при время выполнения.
Я определил, что в AbstractBeanFactory.doGetBean()
бин правильно идентифицируется как одноэлементный, но по какой-то причине фабрика бинов для задания не знает о фабрике бинов для родительского контекста.
Я переформировал некоторые компоненты в область действия Application, но компонент области применения (по-видимому) недопустим в контексте весеннего пакета.
Либо я что-то неправильно понимаю в области пружин, либо что-то не так с моей инициализацией элементов подпружиненной партии (код ниже). Я склоняюсь к обоим, так как одно приведет к другому.
Поскольку я понимаю области действия Spring, я должен видеть что-то вроде этого, с каждой дочерней областью, способной видеть синглеты, определенные в родительской области:
AnnotationConfigWebApplicationContext (web application context)
|
v
ResourceXmlApplicationContext (1 per registered job)
|
v
ResourceXmlApplicationContext (1 per registered step)
Код инициализации, о котором идет речь:
@Component("mySingletonScopedBean")
@Scope(value = "singleton", proxyMode = ScopedProxyMode.DEFAULT)
@Order(1)
public class MySingletonScopedBean {
// getters, setters, etcetera
}
// EDIT: Added in response to comment below
@Autowired
public ApplicationContext applicationContext;
@Bean
public ClasspathXmlApplicationContextsFactoryBean classpathXmlApplicationContextsFactoryBean () throws IOException
{
String resourcePath = somePath "*.xml";
logger.trace("classpathXmlApplicationContextsFactoryBean() :: {} ", resourcePath);
Resource[] resources = applicationContext.getResources(resourcePath);
ClasspathXmlApplicationContextsFactoryBean bean = new ClasspathXmlApplicationContextsFactoryBean ();
bean.setApplicationContext(applicationContext);
bean.setResources(resources);
return bean;
}
@Bean
public AutomaticJobRegistrar automaticJobRegistrar() throws IOException, Exception {
ClasspathXmlApplicationContextsFactoryBean c = classpathXmlApplicationContextsFactoryBean ();
AutomaticJobRegistrar automaticJobRegistrar = new AutomaticJobRegistrar();
automaticJobRegistrar.setApplicationContext(applicationContext);
automaticJobRegistrar.setApplicationContextFactories(c.getObject());
automaticJobRegistrar.setJobLoader(jobLoader());
return automaticJobRegistrar;
}
@Bean
public JobLoader jobLoader() {
DefaultJobLoader jobLoader = new DefaultJobLoader(jobRegistry(), stepRegistry());
return jobLoader;
}
@Bean
public StepRegistry stepRegistry() {
MapStepRegistry stepRegistry = new MapStepRegistry();
return stepRegistry;
}
@Bean
public JobRegistry jobRegistry() {
JobRegistry jobRegistry = new MapJobRegistry();
return jobRegistry;
}
Редактировать: Закрытие
Инициализация всей весенней среды была испорчена.
Я экономлю свои знания о «чистой» модели впрыскивания и о том, как больно разбираться с вещами, когда они ломаются к массивной записи в блоге после этого проекта.