【问题标题】:How do I add beans dynamically in code in a Spring (Boot) application?如何在 Spring (Boot) 应用程序的代码中动态添加 bean?
【发布时间】: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。”

【问题讨论】:

    标签: spring rabbitmq


    【解决方案1】:

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

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

    【讨论】:

    • 我终于开始尝试这种方法了。我遇到的问题是Environment 不允许您将属性视为地图;您可以要求已知属性,但不能要求“此属性下的所有值都将其视为虚线路径”。 Spring Boot 有映射到 Maps 的能力,但我不知道如何从注册器中访问其他 bean。
    猜你喜欢
    • 2019-12-08
    • 1970-01-01
    • 2014-11-10
    • 1970-01-01
    • 2019-12-01
    • 2023-02-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    相关资源
    最近更新 更多