Spring WebApplicationContext で実行時に Bean インスタンスを追加するにはどうすればよいでしょうか? 質問する

Spring WebApplicationContext で実行時に Bean インスタンスを追加するにはどうすればよいでしょうか? 質問する

タイトルは非常にわかりやすいです。Springが提供するインターフェースDynamicBeanHandlerを実装するハンドラー クラスがあります。このクラスでは、次のように Bean クラスが設定されたBeanDefinitionRegistryPostProcessor複数の Bean を追加しています。SCOPE_SINGLETONMyDynamicBean

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 つを削除し、後でレジストリ インスタンスがない場所に新しいインスタンスを追加したいときに発生します。これを行う方法を見つけるのを手伝ってくれる人はいますか?SpringUtilApplicationContextAware

以下はクラスのコードです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);
}

おすすめ記事