java - 按名称、类型和构造函数参数检索 bean 的正确 BeanFactory 用法
问题描述
我有许多原型 bean,它们都共享一个共同的超类 ( Foo
)。所有这些 bean 都有一个带有一个 String 参数的公共构造函数。
我想基于完全限定的 bean 名称和 String 构造函数参数以编程方式检索(和创建)这些 bean。因为这个 bean 名称来自(外部)配置,所以我需要确保只有公共超类的 beanFoo
才能以这种方式构造。
想象一下:
- 界面
Foo
- 豆
A implements Foo
- 豆
B implements Foo
- 豆
C implements Bar
我现在需要一个方法来做到这一点:
public Foo getBean(String name, String arg) {
// Create a new instance of A or B (but not C) depending on name.
// Pass args as the constructor argument
}
我已经设法尝试排除以下内容:
BeanFactory#getBean(String name, Object... args)
太笼统了。允许创建任何匹配的 bean,而不是 typeFoo
。BeanFactory#getBean(String name, Class<T> requiredType)
. 无法传递构造函数参数ObjectProvider<Foo>#getObject(Object... args)
. 多个 bean 匹配。无法选择A
或B
按名称
看来我需要的是类似的东西,BeanFactory#getBean(String name, Class<T> requiredType, Object... args)
但这似乎不存在。
解决方案
我已经创建了一些有用的东西,但我仍然希望有一个更好、更清洁的解决方案:
public Foo getFoo(String name, String arg) {
if (beanFactory.containsBean(name) && beanFactory.isTypeMatch(name, Foo.class)) {
return (Foo) beanFactory.getBean(name, arg);
}
throw new RuntimeException("nope!");
}
推荐阅读
- c# - 将 WPF 用户控件的启用属性绑定到子控件
- javascript - Webview javascript 在三星 glaxy 选项卡 4.4 版中不起作用
- google-api - 如果我删除包含具有多个父文件的文件的云端硬盘文件夹,该文件是否仍会被删除?
- javascript - 如何在echarts中将数字转换为货币?
- php - 使用会话 php 区分管理员和用户
- python-3.x - 如何在 python3 中模拟 python2 打印语句的行为?
- reactjs - styled-components 是说在你的 React 组件(组件)周围包裹了 styled()
- django - Django:SMTPRecipientsRefused 用于 EmailBackend,但不是 smtplib
- html - 响应式嵌套网格布局
- android - 如何通过 kotlin 中的序数值获取枚举成员?