java - 通过 BeanFactory.getBean(Class<T>) 检索通用 bean

标签 java spring generics

使用 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/

相关文章:

java - 用于高效浅克隆的哈希集实现或技术?

java - 检查方法在应用于值列表的任何元素时是否抛出异常

spring - 如何在 Spring 配置中扩展列表

c# - 如何在 List<T>.BinarySearch 中有效地复制 ArrayList.BinarySearch?

java - 从 Spring JdbcTemplate 的 queryForObject 方法返回泛型类型

java - 从 TableView javafx 中删除列

java - 错误信息我不明白R renjin

java - 保存 ModelAttribute 时出现空指针异常 [Spring MVC]

java - NoSuchBeanDefinitionException : No bean named 'authService' available

c# - 将对象转换为 List<T> 以便能够使用扩展方法