Мне нужно иметь возможность добавлять новые bean-компоненты в веб-контекст Spring (в любой области) для классов, которые могут быть определены, а могут и не быть определены в пути к классам во время компиляции.
Например, я мог бы создать некоторые из этих классов динамически, а затем зарегистрировать одноэлементный или сеансовый компонент для этого класса.
Я немного читал о BeanFactoryPostProcessor, но не уверен, будет ли он работать в веб-контексте, и, если я правильно понимаю, он будет работать только до фактической загрузки экземпляров bean-компонента, а не после этого, или я ошибаюсь?
Мне не удалось найти информацию о том, как это сделать в AnnotationConfigWebApplicationContext, и, по крайней мере, в моем тесте все bean-компоненты, которые я создаю динамически, не внедряются в другие экземпляры, и даже если бы они были, я вижу только метод для регистрации Singleton beans, но не для других областей:
ctx.getBeanFactory().registerSingleton("dummy", dummy);
P.D.
Я нашел этот вопрос: Динамическое создание beans в Spring, но когда я пытаюсь добавьте любой bean-компонент, определение bean-компонента или построитель определения bean-компонента в веб-контекст, например, bean-компонент не загружается:
AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.setServletContext(servletContext);
ctx.refresh();
//
log.trace("Registering first test bean");
Test test = new Test();
test.setDummy("x1");
ctx.getBeanFactory().registerSingleton("myTestBean1", test);
log.trace("Registering second test bean");
BeanDefinition testDef = new RootBeanDefinition(Test.class);
testDef.setScope(BeanDefinition.SCOPE_SINGLETON);
ctx.getBeanFactory().registerSingleton("myTestBean2", testDef);
Test dummy1 = (Test)ctx.getBean("myTestBean1");
Object dummy2 = ctx.getBean("myTestBean2");
log.trace("beans: 1: {}; 2: {}", dummy1, dummy2); //<--this works, but...
ctx.refresh();
ctx.register(MyConfig.class); //configuring other beans
... Когда я делаю это из другого bean-компонента, настроенного внутри MyConfig.class или аннотированного с помощью @Component (это может быть даже другой динамический компонент):
@Autowire Test myTestBean1;
//Or this:
Object a = this.ctx.getBean("myTestBean1"); //Or myTestBean2
Выдает исключение NoSuchBeanDefinitionException
Пожалуйста помогите!! Я много искал и не нашел никакой полезной информации, или, может быть, я нашел, но я не могу протестировать все, что я нахожу в Интернете, за такое короткое время, и документация spring кажется очень хорошей только для обычных случаев и конфигураций xml, а не для этих сумасшедших вещей, которые я пытаюсь сделать, а не для программной настройки.
ctx.refresh()
во второй строке, который создает всю фабрику компонентов и обрабатывает все автоматические подключения. Это происходит до того, как вы сделаете что-то еще. Несмотря на это, ручная вставка bean-компонентов во время выполнения — это не то, как должен работать Spring. Я уверен, что вы можете заставить его работать как-то, но это не будет красиво. Если вам нужно отложить/отложить создание bean-компонента, вы должны работать с областями действия и/или фабриками и интерфейсами. 07.09.2012