Lod*_*rds 11 java generics spring
我有一堆实现类型的存储库bean Repository<T ? extends Node>
.现在我可以从用户那里获得一个随机节点列表,我想为每个节点获取相应的存储库.从Spring 4.0RC1开始,我们可以像这样自动装配存储库:
@Autowired Repository<SomeNode> someNodeRepository;
Run Code Online (Sandbox Code Playgroud)
如此处所述.
这工作正常,但我的问题是如何基于泛型类型动态地执行此操作.
我想做的是:
public <T extends Node> T saveNode(T node) {
Repository<T> repository = ctx.getBean(Repository.class, node.getClass());
return repository.save(node);
}
Run Code Online (Sandbox Code Playgroud)
其中第二个参数是泛型类型.这当然不起作用,虽然它编译.
我找不到任何关于此的文件.
jha*_*has 17
你可以这样做:
String[] beanNamesForType = ctx.getBeanNamesForType(ResolvableType.forClassWithGenerics(Repository.class, node.getClass()));
// If you expect several beans of the same generic type then extract them as you wish. Otherwise, just take the first
Repository<T> repository = (Repository<T>) ctx.getBean(beanNamesForType[0]);
Run Code Online (Sandbox Code Playgroud)
从 Spring 5.1 开始,你可以获得Repository<T>
这样类型的 bean:
public static <T> Repository<T> getRepositoryFor(Class<T> clazz)
{
ResolvableType type = ResolvableType.forClassWithGenerics(Repository.class, clazz);
return (Repository<T>) context.getBeanProvider(type).getObject();
}
Run Code Online (Sandbox Code Playgroud)