使用泛型通过上下文获取spring bean

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)

  • 我从不粘贴我没有检查过的代码.它编译并运行...注意`getBeanNamesForType`有3个版本,其中一个版本接受`ResolvableType` (2认同)

sem*_*ude 5

从 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)