如何在 Spring (Boot) 应用程序的代码中动态添加 bean?

Posted

技术标签:

【中文标题】如何在 Spring (Boot) 应用程序的代码中动态添加 bean?【英文标题】:How do I add beans dynamically in code in a Spring (Boot) application? 【发布时间】:2017-03-09 10:38:02 【问题描述】:

我有一个使用 spring-rabbit 的 Spring(启动)应用程序,我根据需要创建绑定 bean,如下所示:

导入 org.springframework.amqp.core.*; 导入 org.springframework.beans.factory.annotation.Value; 导入 org.springframework.context.annotation.Bean; 导入 org.springframework.context.annotation.Configuration; @配置 公共类队列绑定 // 第一个绑定 @豆角,扁豆 公共队列 firstQueue(@Value("$rabbitmq.first.queue") String queueName) 返回新队列(队列名称); @豆角,扁豆 public FanoutExchange firstExchange(@Value("$rabbitmq.first.exchange") String exchangeName) 返回新的 FanoutExchange(exchangeName); @豆角,扁豆 公共绑定 firstBinding(队列 firstQueue,FanoutExchange firstExchange) 返回 BindingBuilder.bind(firstQueue).to(firstExchange); // 第二次绑定 @豆角,扁豆 公共队列 secondQueue(@Value("$rabbitmq.second.queue") String queueName) 返回新队列(队列名称); @豆角,扁豆 public FanoutExchange secondExchange(@Value("$rabbitmq.second.exchange") String exchangeName) 返回新的 FanoutExchange(exchangeName); @豆角,扁豆 公共绑定 secondBinding(队列 secondQueue,FanoutExchange secondExchange) 返回 BindingBuilder.bind(secondQueue).to(secondExchange);

我遇到的问题是每 3 个 bean 只有两条信息,队列名称和交换名称。

有没有办法在上下文中添加任意数量的 bean,而不是复制和粘贴一堆 @Bean 方法?我想要类似“对于此列表中的每个名称,使用此连接添加这三个 bean。”

【问题讨论】:

【参考方案1】:

要以编程方式注册任意数量的 bean,您需要下拉到较低级别的 API。您可以在配置类上使用@Import 来引用ImportBeanDefinitionRegistrar 实现。在注册器的 registerBeanDefinitions 方法中,您将注册所有 bean 的 bean 定义。

如果您希望能够在外部配置将要注册的 bean,ImportBeanDefinitionRegistrar 可以是 EnvironmentAware。这允许您注入 Environment,以便您可以使用它的属性来自定义注册器将注册的 bean。

【讨论】:

我终于开始尝试这种方法了。我遇到的问题是Environment 不允许您将属性视为地图;您可以要求已知属性,但不能要求“此属性下的所有值都将其视为虚线路径”。 Spring Boot 有映射到 Maps 的能力,但我不知道如何从注册器中访问其他 bean。

以上是关于如何在 Spring (Boot) 应用程序的代码中动态添加 bean?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Visual Studio 代码中运行 Spring Boot 应用程序?有可能吗?

如何找到 Spring Boot 应用程序的入口点?

如何在 Spring Boot + Spring Security 应用程序中配置 CORS?

如何防止我的 Spring Boot Batch 应用程序在执行测试时运行?

如何在 OpenShift 上部署多模块 maven spring boot 应用程序

如何在没有kafka服务器的情况下运行spring boot