在应用程序启动后,我正在尝试一种动态添加spring的方法。
我发现了几个类似问题的地方,比如在这里
我知道ApplicationContext扩展点,如ApplicationContext事件和BeanFactoryPostProcessor。
我手头的问题是,在创建了一些been之后,我需要添加been,我想应该放弃BeanFactoryPostProcessor选项,就像在应用程序上下文开始注册been之前发生的那样。
在刷新上下文之后,我尝试添加一个singletonBean:
@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之后没有触发的后置处理器。我真的不能强迫你刷新一下。
有办法解决这个鸡蛋问题吗?
发布于 2015-12-04 20:35:48
见AutowireCapableBeanFactory.initializeBean(beanName)。
您需要确保bean在注册和初始化之间没有使用。
另外,要注意的是,在上下文初始化后注册单个程序直到最近(我认为是4.2.2)才是真正的线程安全。如果其他代码迭代工厂中的bean,则可能导致ConcurrentModificationExceptions。
但是,在这种情况下,要注册HTTP路径可能为时已晚,您可能需要更多代码来完成这一任务。
https://stackoverflow.com/questions/34094282
复制相似问题