首页 > 解决方案 > 允许 bean 实现不定义 getBean 提供的参数

问题描述

我的应用程序使用配置文件(解析为@ConfigurationProperties)来启动多个网络流,其中包含不同的服务/处理器。一个很好的类比是从外部配置设置 Netty 通道管道。

YAML 属性如下所示:

streams:
- type: tcp-server
  port: 2000
  services:   # this is the tricky part
  - type: watchdogTimer
  - type: someFormatConverter
  - type: dbLogger
    options: 
    - table: "things"

我希望服务易于定义、创建和定位。所以我决定使用 Spring 作为它们的注册表——它们可以是原型范围的 Spring bean,type是 Spring Bean 的名称,它们是这样创建的:

// Kotlin language
@Autowired
private lateinit var appContext: ApplicationContext

fun createStreamService(stream: MyStream, type: String, options:Map<String,String>): MyStreamService {
  return appContext.getBean(type, stream, options) as MyStreamService
}

我的问题是,即使服务不需要流或选项引用,我仍然必须将它们放在构造函数中(stream:MyStream, options:Map<String,String>)是否可以提供 bean 实现签名中可能不存在的参数?我知道您可以使它们成为可选的,因为呼叫站点无法提供它们,但是另一种方式呢?

标签: springspring-bean

解决方案


如果没有更好的解决方案,我将传递封装所有参数(流和选项)的单个对象。

虽然仍然是实现构造函数签名的强制执行,但它更简洁,并且在不破坏兼容性的情况下为扩展留出了空间。


推荐阅读