タイトルは非常にわかりやすいです。Springが提供するインターフェースDynamicBeanHandler
を実装するハンドラー クラスがあります。このクラスでは、次のように Bean クラスが設定されたBeanDefinitionRegistryPostProcessor
複数の Bean を追加しています。SCOPE_SINGLETON
MyDynamicBean
GenericBeanDefinition myBeanDefinition = new GenericBeanDefinition();
myBeanDefinition.setBeanClass(MyDynamicBean.class);
myBeanDefinition.setScope(SCOPE_SINGLETON);
myBeanDefinition.setPropertyValues(getMutableProperties(dynamicPropertyPrefix));
registry.registerBeanDefinition(dynamicBeanId, myBeanDefinition);
メソッドgetMutableProperties()
は のオブジェクトを返しますMutablePropertyValues
。
その後、クラスが実装するSpringUtil.getBean(dynamicBeanId)
必要なMyDynamicBean
インスタンスを取得します。これはすべてうまく機能します。問題は、これらのインスタンスの 1 つを削除し、後でレジストリ インスタンスがない場所に新しいインスタンスを追加したいときに発生します。これを行う方法を見つけるのを手伝ってくれる人はいますか?SpringUtil
ApplicationContextAware
以下はクラスのコードです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);
}
}
ベストアンサー1
BeanDefinitionRegistry
(見て)を活用できますここAPI の場合) を使用して、Bean を動的に削除または登録します。
したがって、SpringUtil
クラスでは、 を使用して既存の Bean 定義を削除する以下のメソッドを追加しremoveBeanDefinition()
、 を使用して新しい Bean 定義を追加できます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);
}