Java 通过BeanFactory.getBean(Class<;T>;)检索泛型bean
使用Spring4.x,我可以轻松地自动连接通用bean,并让Spring安全地找到它,即使容器bean是通用的 例如,以下工作(参见)Java 通过BeanFactory.getBean(Class<;T>;)检索泛型bean,java,spring,generics,Java,Spring,Generics,使用Spring4.x,我可以轻松地自动连接通用bean,并让Spring安全地找到它,即使容器bean是通用的 例如,以下工作(参见) 类MyBean{ @自动连线 私家道道; } 类MyBean{ @自动连线 私家道道; } 但是,有时我需要在方法执行期间在运行时检索bean,而不是依赖于自动连接(例如,在上下文初始化期间bean可能还没有准备好) private myCode(){ BeanFactory BeanFactory;//或可配置列表BeanFactory Dao-Dao=b
类MyBean{
@自动连线
私家道道;
}
类MyBean{
@自动连线
私家道道;
}
但是,有时我需要在方法执行期间在运行时检索bean,而不是依赖于自动连接(例如,在上下文初始化期间bean可能还没有准备好)
private myCode(){
BeanFactory BeanFactory;//或可配置列表BeanFactory
Dao-Dao=beanFactory.getBean(..);
}
考虑事项:
- getBean接受bean名称和/或类型参数。在运行时,我可以知道或不知道bean的名称
- 类解析为Dao的任何通用实现(例如Dao和Dao)
相关:我知道Spring的
RestTemplate
需要一个参数化的TypeReference,当您需要将调用绑定到List
(当您知道T时)的返回类型时,下面的解决方法是有效的。但是,我不会接受我的答案,因为变通方法缺乏可读性,并且受到未经检查的强制转换的影响
String[] names = beanFactory.getBeanNamesForType(ResolvableType.forClassWithGenerics(Dao.class, Entity.class));
Dao<Entity> dao = beanFactory.getBean(names[0], Dao.class);
String[]names=beanFactory.getBeanNamesForType(ResolvableType.forclasswith泛型(Dao.class,Entity.class));
Dao-Dao=beanFactory.getBean(名称[0],Dao.class);
理由:Spring允许获取参数化类型的bean名称。在第一个调用只返回一个结果的假设下,第二个调用通过返回该bean来工作。不幸的是,第二个调用生成了编译器时间警告,因为Spring版本4.X.X您只需自动连接
ApplicationContext
,因为它现在实现了BeanFactory
接口。例如:
@Component
public class BeanUtil {
@Autowired
private ApplicationContext applicationContext;
public Parent get() {
ResolvableType resolvableType = ResolvableType.forClassWithGenerics(Parent.class, ResolvableType.forClass(Child.class));
String[] beanNames = applicationContext.getBeanNamesForType(resolvableType);
assert beanNames.length == 1;
String beanName = beanNames[0];
Parent parent = applicationContext.getBean(beanName, Parent.class);
return parent;
}
}
因缺乏更好的回答而被接受,罚款+1。似乎没有更好的选择。
String[] names = beanFactory.getBeanNamesForType(ResolvableType.forClassWithGenerics(Dao.class, Entity.class));
Dao<Entity> dao = beanFactory.getBean(names[0], Dao.class);
@Component
public class BeanUtil {
@Autowired
private ApplicationContext applicationContext;
public Parent get() {
ResolvableType resolvableType = ResolvableType.forClassWithGenerics(Parent.class, ResolvableType.forClass(Child.class));
String[] beanNames = applicationContext.getBeanNamesForType(resolvableType);
assert beanNames.length == 1;
String beanName = beanNames[0];
Parent parent = applicationContext.getBean(beanName, Parent.class);
return parent;
}
}