首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring在运行时添加bean

Spring在运行时添加bean
EN

Stack Overflow用户
提问于 2015-12-04 17:42:10
回答 1查看 685关注 0票数 0

在应用程序启动后,我正在尝试一种动态添加spring的方法。

我发现了几个类似问题的地方,比如在这里

我知道ApplicationContext扩展点,如ApplicationContext事件和BeanFactoryPostProcessor。

我手头的问题是,在创建了一些been之后,我需要添加been,我想应该放弃BeanFactoryPostProcessor选项,就像在应用程序上下文开始注册been之前发生的那样。

在刷新上下文之后,我尝试添加一个singletonBean:

代码语言:javascript
复制
@EventListener
    public void postProcess(ContextRefreshedEvent refreshedEvent) throws BeansException {
        ConfigurableListableBeanFactory beanFactory = ((ConfigurableApplicationContext)refreshedEvent.getApplicationContext()).getBeanFactory();
        List<Api> apis = repository.findAll();
        apis.forEach(api -> {
            api.getEndpoints().forEach(endpoint -> {
                HttpRequestHandlingMessagingGateway gateway = createGateway(endpoint);
                customIntegrationHandlerMapping.register(gateway);
                beanFactory.registerSingleton("httpflow-"+endpoint.getId(),createEndpointFlow(gateway));
            });
        });
    }

问题是,IntegrationFlow依赖于在注册单例bean之后没有触发的后置处理器。我真的不能强迫你刷新一下。

有办法解决这个鸡蛋问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-12-04 20:35:48

AutowireCapableBeanFactory.initializeBean(beanName)

您需要确保bean在注册和初始化之间没有使用。

另外,要注意的是,在上下文初始化后注册单个程序直到最近(我认为是4.2.2)才是真正的线程安全。如果其他代码迭代工厂中的bean,则可能导致ConcurrentModificationExceptions

但是,在这种情况下,要注册HTTP路径可能为时已晚,您可能需要更多代码来完成这一任务。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34094282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档