使用 Spring 4.x,我可以轻松地 Autowiring 通用 bean 并让 Spring 安全地找到它,即使容器 bean 是通用的。
例如以下工作(参见 also )
class MyBean {
@Autowired
private Dao<Entity> dao;
}
class MyBean<T> {
@Autowired
private Dao<T> dao;
}
但是我有时需要在方法执行期间在运行时检索 bean,而不是依赖 Autowiring (例如,在上下文初始化期间 bean 可能还没有准备好)
private myCode() {
BeanFactory beanFactory; //or ConfigurableListableBeanFactory too
Dao<Entity> dao = beanFactory.getBean(....????....);
}
注意事项:
- BeanFactory.getBean 接受 bean 名称和/或类型参数。我在运行时可能知道也可能不知道 bean 的名称
- Dao.class 解析为 Dao 的任何通用实现(例如 Dao 和 Dao)
问题是:
如何调用 BeanFactory 来获取绑定(bind)到给定类型的 bean 实例?
相关:我知道Spring的RestTemplate
当您需要将调用绑定(bind)到 List<T>
的返回类型时,需要一个 ParameterizedTypeReference (当你知道 T 时)
最佳答案
以下解决方法有效。但是我不会接受我的回答,因为解决方法缺乏可读性并且受到未经检查的转换的影响
String[] names = beanFactory.getBeanNamesForType(ResolvableType.forClassWithGenerics(Dao.class, Entity.class));
Dao<Entity> dao = beanFactory.getBean(names[0], Dao.class);
基本原理:Spring 允许获取参数化类型的 bean 名称。在第一个调用仅返回一个结果的假设下,第二个调用通过返回那个 bean 来工作。不幸的是,第二次调用会生成编译器时间警告
关于java - 通过 BeanFactory.getBean(Class<T>) 检索通用 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47751223/