使用属性文件的配置创建未知数量的 Bean

2024-02-17

我的情况是,我有一个属性文件来配置未知数量的 bean:

rssfeed.source[0]=http://feed.com/rss-news.xml
rssfeed.title[0]=Sample feed #1
rssfeed.source[1]=http://feed.com/rss-news2.xml
rssfeed.title[1]=Sample feed #2
:

我有一个配置类来读取这些属性:

@Configuration
@EnableConfigurationProperties
@ConfigurationProperties(prefix = "rssfeed", locations = "classpath:/config/rssfeed.properties")
public class RssConfig {

  private List<String> source = new ArrayList<String>();
  private List<String> title = new ArrayList<String>();

  public List<String> getSource() {
    return source;
  }
  public List<String> getTitle() {
    return title;
  }

  @PostConstruct
  public void postConstruct() {

  }
}

这工作得很好。然而,现在我想基于此创建 bean。到目前为止我尝试过的是

  1. add @Bean- 方法并从中调用它们postConstruct()

      @Bean
      @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
      public SourcePollingChannelAdapter createFeedChannelAdapter(int id, String url) {
        SourcePollingChannelAdapter channelAdapter = new SourcePollingChannelAdapter();
        channelAdapter.setApplicationContext(applicationContext);
        channelAdapter.setBeanName("feedChannelAdapter" + id);
        channelAdapter.setSource(createMessageSource(id, url));
        return channelAdapter;
      }
    
      @Bean
      @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
      public FeedEntryMessageSource createMessageSource(int id, String url) {
        try {
          FeedEntryMessageSource messageSource = new FeedEntryMessageSource(new URL(url), "");
          messageSource.setApplicationContext(applicationContext);
          messageSource.setBeanName("feedChannelAdapter" + id + ".source");
          return messageSource;
        } catch (Throwable e) {
          Utility.throwAsUncheckedException(e);
          return null;
        }
      }
    
      @Bean
      @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
      public QueueChannel createFeedChannel(int id, String url) {
        QueueChannel channel = new QueueChannel();
        channel.setApplicationContext(applicationContext);
        channel.setBeanName("feedChannel" + id);
        return channel;
      }
    
      @PostConstruct
      public void postConstruct() {
        for (int x = 0; x < source.size(); x++) {
          createFeedChannelAdapter(x, source.get(x));
        }
      }
    

    但是,Spring 尝试将参数自动连接到这些方法,而不是使用我在postConstruct().

  2. a BeanFactoryPostProcessor or a BeanDefinitionRegistryPostProcessor。但是,在这里我无权访问属性文件或RssConfig-bean 来自上面,因为它在生命周期中调用得太早。

我需要做什么来生成这些动态数量的 bean?我可能只差那么一小步...我更喜欢 Java 配置解决方案而不是 XML 解决方案。


您需要注册 bean 定义(而不是调用@Bean方法),所以BeanDefinitionRegistryPostProcessor or ImportBeanDefinitionRegistrar是目前做到这一点的最佳方法。您可以获取属性文件并使用绑定到它PropertiesConfigurationFactory(在 Spring Boot 中)而不是使用@ConfigurationProperties,或者也许您可以使用父上下文或独立的上下文SpringApplication创建并绑定您的RssConfig在你的 bean 定义注册代码中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用属性文件的配置创建未知数量的 Bean 的相关文章

随机推荐

  • C在short和int之间转换的规则是什么?

    当使用 C 在 Short 和 int 之间进行转换时 我感到很困惑 我假设short是16位 int是32位 我用下面的代码进行了测试 unsigned short a 0xFFFF signed short b 0xFFFF unsig
  • 在 Win32 C++ 中创建 GUI

    我正在开发我的第一个 Windows 桌面应用程序 并且正在尝试找出创建该程序的 GUI 的最佳方法 我知道 我知道 考虑到有关该主题的数据量 我觉得问这个问题很愚蠢 然而 大多数答案似乎已经过时 我不确定它们是否适合我的特定项目 另外 W
  • 什么是测试中的软件故障? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在上软件测试的研究生课程 我们花了一整堂课来讨论故障 错误和故障之间的区别 我对测试中软件故障的定义不满意 你的定义是什么 您可能对此感兴趣
  • 何时使用 Vanilla JavaScript 与 jQuery?

    我注意到 在监视 尝试回答常见 jQuery 问题时 有一些使用 javascript 而不是 jQuery 的做法 实际上使您能够少写多做 同样的数量 并且还可能产生性能优势 一个具体的例子 this vs this 在引用被单击对象 i
  • Visual C++ 似乎对类的 POD 成员进行了零初始化,但它不应该这样做

    我有一堂这样的课 class TestClass public TestClass Note I wish not to initialize rawMemory for whatever reason int rawMemory 32 i
  • x86 上 Java 侵入性最小的编译屏障

    如果我有一个 Java 进程通过共享 ByteBuffer 或类似的方式与其他进程交互 那么 C C 中的编译器屏障的侵入性最小的等效项是什么 不需要可移植性 我对 x86 特别感兴趣 例如 我有 2 个进程根据伪代码读取和写入内存区域 p
  • 在 C# 中替换字符串中的所有特殊字符

    我想找到字符串中的所有特殊字符并用连字符 我正在使用下面的代码 string content foo bar regular expression replace 123 string pattern a zA Z regex patter
  • 将 PHP 字符串剪短

    你会如何把字符串剪短 这样它就不会进入 div 标签中的下一行例如我的message字符串包含以下内容 我们更喜欢可以回答的问题 而不仅仅是讨论 提供详细信息 写得清楚 简单 如果您的问题与此网站有关 请在元上提问 我想最好将其显示为 我们
  • 安装 hunspell 包

    我期待使用 pip 安装 hunspell 包 但它会抛出以下错误 Collecting hunspell Using cached hunspell 0 4 1 tar gz Building wheels for collected p
  • Ubuntu 18.04 服务器(Rails 6.0)上的“生产”环境缺少“secret_key_base”,尝试了多个主题

    这个话题有一个SOLUTION嵌入在最后 PROBLEM 我第一次在 Ubuntu 18 04 上的 VPS 上部署 Rails 应用程序 与 Nginx 一起 我遵循了很好的教程Gorails https www youtube com
  • 更改 HttpWebRequest 实例的 Uri?

    我有一个在事件中拦截的 HttpWebRequest 实例 我想在发送请求之前编辑 url 但我找不到执行此操作的方法 属性 RequestUri 是只读的 我想了几种方法 但似乎找不到可行的解决方案 使用反射来设置值 创建一个新请求 然后
  • Python - 在迭代字典列表时如何处理丢失的键? [复制]

    这个问题在这里已经有答案了 在下面的示例中 我迭代字典列表 并将 年龄 保存在列表中 然而 第二个字典没有键 年龄 在这种情况下 我希望将 null 值保存在列表中 关于如何实现这一目标有什么建议吗 my list age 0 name A
  • CHANGEM 的优雅矢量化版本(替代值) - MATLAB

    在Matlab 2012b中 有一个changem函数允许您用一组键指定的其他值替换矩阵的元素 替换数据数组中的值 http www mathworks com help map ref changem html jsessionid 7b
  • 来自另一个 bigDecimal.toString() 的 new BigDecimal 是否始终等于?

    在Java中 来自另一个bigDecimal toString 的new BigDecimal总是等于吗 例如 BigDecimal a new BigDecimal 1 23 BigDecimal b new BigDecimal a t
  • UIViewController 动画时方向错误

    为了使用 UISplitViewController 我在从一个视图控制器导航到另一个视图控制器时替换了窗口根控制器 为了在执行此操作时获得一些不错的过渡 我使用了如下的缩放效果 MyOtherViewController controll
  • SocketServer绑定多个服务器

    我正在尝试使用 python 的 SocketServer 模块绑定多个服务器 import SocketServer from SocketServer import BaseRequestHandler class HTTPSERVER
  • MYSQL子集操作

    有没有办法实现类似的目标 SELECT FROM tb values WHERE value1 value2 value3 SUBSET OF SELECT value FROM tb value WHERE isgoodvalue tru
  • 在 Android Studio 上运行的 HTC One M8

    有谁使用HTC One M8设备开启安卓工作室 我的问题是 IDE 无法识别它 我杀死了 AVD 重新启动了 IDE 几次 拔插了设备 但仍然无法识别 HTC One M8 与 Android Studio 配合使用的要求是 安装 HTC
  • 是否可以获得鼠标按钮 4、5 等?

    简而言之 有没有办法在 JavaScript 中检测额外的鼠标按钮按下情况 它没有与其余的鼠标输入一起记录 所以我猜它不在标准实现中 有没有什么方法 例如库 可以启用额外的鼠标按钮 是的 你可以这样做 检查一下鼠标事件 button htt
  • 使用属性文件的配置创建未知数量的 Bean

    我的情况是 我有一个属性文件来配置未知数量的 bean rssfeed source 0 http feed com rss news xml rssfeed title 0 Sample feed 1 rssfeed source 1 h