如何在 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 Security 应用程序中配置 CORS?
如何防止我的 Spring Boot Batch 应用程序在执行测试时运行?