当前位置: 首页 > 知识库问答 >
问题:

Spring在运行时添加bean

东门晟
2023-03-14

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

我手头的问题是,在创建了一些bean之后,我需要添加bean,我想这会丢弃BeanFactoryPostProcessor选项,因为在应用程序上下文开始注册bean之前会发生这种情况。

我尝试在上下文刷新后添加一个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));
            });
        });
    }

共有1个答案

白青青
2023-03-14

参见AutowireCapableBeanFactory.InitializeBean(beanName)。

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

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

 类似资料:
  • 我正在寻找一种解决方案,当DB密码更改而不重新启动时,SpringBoot可以重新创建新的数据源。 Spring数据源。url=url-spring。数据源。username=usr-spring。数据源。password=passwordexamplespring。数据源。驱动程序类名=oracle。jdbc。驾驶员OracleDriver 我有这样定义数据源。实现这一点的最好方法是什么。

  • 问题内容: 因此,标题非常简单。我有一个处理程序类,它实现了spring提供的接口。在这个类中,我将添加多个具有如下bean类设置的bean : 该方法返回的对象。 稍后,我将获取类实现的必需实例。所有这些都很好。当我要删除其中一个实例并在以后没有注册表实例的位置添加新实例时,就会出现问题。谁能帮我找到一种方法吗? 以下是该类的代码- 问题答案: 您可以利用(在此处查找API)动态删除或注册Bea

  • 我是Spring的新手。我有下面的Person bean,其中包含姓名、地址和年龄作为属性。现在我想在我的自定义BeanFactoryPostProcess中向Person bean添加名为性别的新属性。我的人bean实现了属性访问器。 XML配置文件 自定义BeanFactoryPostProcess 人员类别 客户端程序 如果我访问性别我得到null 请让我知道如何动态设置和获取属性。

  • 我已经浏览了之前关于在运行时添加Log4j2附加器的线程,但没有一个真正适合我的场景。 我们将一个长时间运行的Flink作业打包到一个胖jar中,我们基本上将其提交给一个运行的Flink集群。我们想把错误日志转发给哨兵。很方便,Sentry提供了一个我希望能够使用的Log4j2 appender,但所有让Log4j2工作的尝试都失败了——对此有点疯狂(花了几天时间)。 因为Flink(也使用log

  • Spring Boot:如何在运行时添加新数据源 我的项目想要连接两个数据源。 第一个数据源我可以在application.properties配置,但第二个数据源不能配置,因为此配置位于第一个数据源的DB的表配置中。 所以, 配置第一个数据源 现在,我从application.properties配置两个数据源,它的工作。 但需求需要更改第一个数据源表中的第二个数据源。T、 T型 请给我一些建议

  • 我通过HiberNate将用户保存在DB表中,我使用Spring Security进行身份验证: 这非常有效,但有一点需要注意:用户在服务器启动时被加载。我需要编写方法RegisterUser(用户用户),在运行时将新用户添加到Spring Security。这种方法应该只关注这项任务。我不知道如何开始实现这个功能,所以谢谢你的建议!;) Ofc用户有登录名、密码、角色字符串等字段。。。 请不要发