根据@AdrianMitev的评论,我最终编写了这个类,它返回一个托管CDI Bean的实例,给定其类名(elName)或类类型:
public class GetInstance {
public static Object of(String elName) {
BeanManager bm = getBeanManager();
Bean<?> bean = bm.resolve(bm.getBeans(elName));
return bm.getReference(bean, bean.getBeanClass(), bm.createCreationalContext(bean));
}
@SuppressWarnings("unchecked")
public static <T> T of(Class<T> clazz) {
BeanManager bm = getBeanManager();
Bean<?> bean = bm.resolve(bm.getBeans(clazz));
return (T) bm.getReference(bean, bean.getBeanClass(), bm.createCreationalContext(bean));
}
private static BeanManager getBeanManager() {
try {
return (BeanManager) new InitialContext().lookup("java:comp/BeanManager");
} catch (NamingException e) {
e.printStackTrace();
}
return null;
}
}
所以,如果你有一个像这样的类:
@Named
public class FooClass {
...
}
您可以使用以下命令获取托管 CDI 实例:
FooClass fC = GetInstance.of(FooClass.class);
或使用其elName
FooClass fC = (FooClass) GetInstance.of("fooClass");
或者您可以选择要使用的名称:
@Named(value="CustomFooClassName")
public class FooClass {
...
}
并使用:
FooClass fC = (FooClass) GetInstance.of("CustomFooClassName");