spring - 允许 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 实现签名中可能不存在的参数?我知道您可以使它们成为可选的,因为呼叫站点无法提供它们,但是另一种方式呢?
解决方案
如果没有更好的解决方案,我将传递封装所有参数(流和选项)的单个对象。
虽然仍然是实现构造函数签名的强制执行,但它更简洁,并且在不破坏兼容性的情况下为扩展留出了空间。
推荐阅读
- android - Android Room 多个字段具有相同的 columnName
- python - 我可以编写一个不可训练/固定权重的 Keras Lambda 层吗?
- node.js - 猫鼬 | 对所有功能保持相同的人口
- r - pandoc 和 RGL 中 knit to html 的问题
- python - Python 说“TrackerMedianFlow_create()”不再是 cv2 的属性,库更新了吗?
- java - CORS:对预检请求的响应未通过访问控制检查:预检请求不允许重定向
- wordpress - 我应该在 WordPress 上为每个页面创建一个新模板吗?
- c# - C# Selenium (0.24) Firefox 新。如何按路径加载配置文件?
- hikaricp - HikariCP/Apache DBCP2 和 PgBouncer
- javascript - 如何每 3 次将一些 HTML 推送到数组以进行输出