这是我手动获取 cdi bean 实例的方式:
Bean<?> bean = (Bean<?>)beanManager.resolve(beanManager.getBeans(Foo.class));
Foo foo=(Foo) beanManager.getReference(bean, bean.getBeanClass(), beanManager.createCreationalContext(bean));
Run Code Online (Sandbox Code Playgroud)
如果我这样声明 Foo 类:
@Dependent
public class Foo{
...
}
Run Code Online (Sandbox Code Playgroud)
一切正常。但是,如果我这样声明 Foo 类
@Dependent
public class Foo<T>{
...
}
Run Code Online (Sandbox Code Playgroud)
cdi 容器无法创建 cdi bean。如何手动获取使用泛型(Foo)声明的类的 cdi bean?
您正在寻找的可能是javax.enterprise.util.TypeLiteral. 它是一个实用程序类,允许您指定(bean)类型以及类型变量。然后它允许检索原始类型以及内部的实际类型参数。这是一个代码片段:
// define the type you want
TypeLiteral<Foo<Bar>> typeLiteral = new TypeLiteral<Foo<Bar>>() {};
// now search for beans; note that getBeans allows to specify Annotations as well!
Set<Bean<?>> beans = beanManager.getBeans(typeLiteral.getType());
// and apply resolution - you should get the one you want here
Bean<?> bean = beanManager.resolve(beans);
Run Code Online (Sandbox Code Playgroud)