Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

187
Views
¿Cómo agregar una instancia de bean en tiempo de ejecución en spring WebApplicationContext?

Entonces, el título es bastante sencillo. Tengo una clase de controlador DynamicBeanHandler que implementa la interfaz BeanDefinitionRegistryPostProcessor proporcionada por Spring. En esta clase, estoy agregando varios beans SCOPE_SINGLETON que tienen una clase de bean configurada como MyDynamicBean de la siguiente manera:

 GenericBeanDefinition myBeanDefinition = new GenericBeanDefinition(); myBeanDefinition.setBeanClass(MyDynamicBean.class); myBeanDefinition.setScope(SCOPE_SINGLETON); myBeanDefinition.setPropertyValues(getMutableProperties(dynamicPropertyPrefix)); registry.registerBeanDefinition(dynamicBeanId, myBeanDefinition);

El método getMutableProperties() devuelve un objeto de MutablePropertyValues .

Más tarde, hago SpringUtil.getBean(dynamicBeanId) para obtener la instancia requerida MyDynamicBean donde la clase SpringUtil implementa ApplicationContextAware . Todo esto funciona muy bien. El problema surge cuando quiero eliminar una de estas instancias y agregar una nueva instancia más adelante donde no tengo la instancia de registro. ¿Puede alguien por favor ayudarme a encontrar una manera de hacer esto?

El siguiente es el código para la clase SpringUtil :

 public class SpringUtil implements ApplicationContextAware { private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { SpringUtil.applicationContext = applicationContext; } public static ApplicationContext getApplicationContext() { return applicationContext; } public static Object getBean(String beanId) { return applicationContext.getBean(beanId); } public static <T> T getBean(String beanId, Class<T> beanClass) { return applicationContext.getBean(beanId, beanClass); } }
over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

Puede utilizar BeanDefinitionRegistry (busque aquí la API) para eliminar o registrar los beans de forma dinámica.

Entonces, en su clase SpringUtil , puede agregar el siguiente método para eliminar la definición de bean existente usando removeBeanDefinition() y luego agregar una nueva definición de bean usando registerBeanDefinition() .

 public void removeExistingAndAddNewBean(String beanId) { AutowireCapableBeanFactory factory = applicationContext.getAutowireCapableBeanFactory(); BeanDefinitionRegistry registry = (BeanDefinitionRegistry) factory; registry.removeBeanDefinition(beanId); //create newBeanObj through GenericBeanDefinition registry.registerBeanDefinition(beanId, newBeanObj); }
over 4 years ago · Santiago Trujillo Report

0

Puede crear programáticamente un bean con dependencias inyectadas de esta manera:

AutowireCapableBeanFactory#createBean

Cree completamente una nueva instancia de bean de la clase dada con la estrategia de conexión automática especificada. Todas las constantes definidas en esta interfaz son compatibles aquí. Realiza la inicialización completa del bean, incluidos todos los BeanPostProcessors aplicables.

 @Autowired ApplicationContext context; AutowireCapableBeanFactory factory = context.getAutowireCapableBeanFactory(); MyDynamicBean bean = (MyDynamicBean) factory.createBean(MyDynamicBean.class, AUTOWIRE_CONSTRUCTOR, false);
over 4 years ago · Santiago Trujillo Report

0

En lugar de autowiring WebApplicationContext, puede hacer

 @Autowired private GenericWebApplicationContext context;

Luego puede registrar un nuevo bean o eliminar uno antiguo y registrar un nuevo bean

 AutowireCapableBeanFactory factory = context.getAutowireCapableBeanFactory(); BeanDefinitionRegistry registry = (BeanDefinitionRegistry) factory; registry.removeBeanDefinition("myBean"); context.registerBean("myBean", MyBean.class, () -> new MyBean());
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!