Necesito poder agregar nuevos beans a un contexto web de primavera (en cualquier ámbito) para clases que podrían y no estar definidas en el classpath en tiempo de compilación.Adición de beans dinámicos al contexto web de primavera
Por ejemplo, podría crear algunas de estas clases dinámicamente y luego registrar un singleton o bean de sesión para esta clase.
He leído un poco sobre BeanFactoryPostProcessor, pero no estoy seguro de si funcionará en un contexto web, y si lo entiendo correctamente, solo funcionará antes de cargar las instancias de bean y no después, ¿o estoy equivocado?
No he podido encontrar información sobre cómo hacer esto en un AnnotationConfigWebApplicationContext, y al menos en mi prueba todos los beans que creo dinámicamente no se inyectan en otras instancias, e incluso si fueran solo veo el método para registrar beans Singleton pero no para otros ámbitos:
ctx.getBeanFactory().registerSingleton("dummy", dummy);
PD
me encontré con esta pregunta: Dynamic creation of beans in Spring pero cuando intento agregar cualquier frijol, frijol o frijol definición constructor definición al contexto web así el frijol no quede cargado:
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
... Cuando hacerlo desde otro bean configurado dentro MyConfig.class o anotado con @Component (podría incluso ser también otro componente dinámico):
@Autowire Test myTestBean1;
//Or this:
Object a = this.ctx.getBean("myTestBean1"); //Or myTestBean2
Se lanza una NoSuchBeanDefinitionException
Por favor, ¡ayúdenme! He estado buscando mucho y no he encontrado ninguna información útil, o tal vez tengo pero no puedo probar todo lo que encuentro en la web en tan poco tiempo y la documentación de primavera solo parece ser muy buena para casos normales y configuraciones xml, no por estas locuras que estoy tratando de hacer y no por la configuración programática.
Me pregunto si se manejan de manera explícita los ciclos de vida de objeto en código Java no simplificar las cosas, gracias –