我有许多原型(prototype) bean,它们都共享一个公共(public)父类(super class) ( Foo
)。所有这些 bean 都有一个采用一个 String 参数的通用构造函数。
我想根据完全限定的 bean 名称和 String 构造函数参数以编程方式检索(并创建)这些 bean。 因为这个 bean 名称来自(外部)配置,所以我需要确保只有公共(public)父类(super class) Foo
的 bean可以这样构建。
想象一下以下情况:
- 界面
Foo
- bean
A implements Foo
- bean
B implements Foo
- bean
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,而不是类型Foo
. -
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!");
}
关于java - 正确使用 BeanFactory 按名称、类型和构造函数参数检索 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60619789/