Как программно внедрить управляемый компонент JAVA CDI в локальную переменную в статическом методе
Как я могу программно ввести управляемый компонент Java CDI 1.1+ в локальную переменную в статическом методе?
6 ответов
чтобы ввести экземпляр класса C
:
javax.enterprise.inject.spi.CDI.current().select(C.class).get()
это доступно в CDI 1.1+
используйте, например, эту утилиту класс. Вы в основном должны получить экземпляр BeanManager
и чем захватить боб, который вы хотите от него (представьте себе что-то вроде поиска JNDI).
обновление
вы также можете использовать CDI класс полезности, предлагаемый в CDI 1.1
SomeBean bean = CDI.current().select(SomeBean.class).get();
@BRS
import javax.enterprise.inject.spi.CDI;
...
IObject iObject = CDI.current().select(IObject.class, new NamedAnnotation("iObject")).get();
С:
import javax.enterprise.util.AnnotationLiteral;
public class NamedAnnotation extends AnnotationLiteral<Named> implements Named {
private final String value;
public NamedAnnotation(final String value) {
this.value = value;
}
public String value() {
return value;
}
}
ссылка, предложенная @Petr Mensik, очень полезна. Я использую тот же код в моем примере.
вот способ получить экземпляр класса в instance methods / static methods. Всегда лучше кодировать интерфейсы вместо использования имени класса, жестко закодированного в методах.
@Named(value = "iObject ")
@RequestScoped
class IObjectImpl implements IObject {.....}
//And in your method
IObject iObject = (IObject) ProgrammaticBeanLookup.lookup("iObject");
.........
//Invoke methods defined in the interface
этот программный поиск компонентов может быть весьма полезен, если у вас есть объект области приложения с методом, который требует экземпляра класса, который может измениться время. Таким образом, всегда лучше извлечь интерфейс и использовать программный bean look up ради свободной связи.
вы должны включить отбор:
List<Annotation> qualifierList = new ArrayList();
for (Annotation annotation: C.class.getAnnotations()) {
if (annotation.annotationType().isAnnotationPresent(Qualifier.class)) {
qualifierList.add(annotation);
}
}
javax.enterprise.inject.spi.CDI.current()
.select(C.class, qualifierList.toArray(new Annotation[qualifierList.size()])
.get()
- вы можете определить параметр с типом интерфейса bean в ваш статический метод и передайте соответствующую ссылку на реализацию. Это сделало бы его более дружественным к юнит-тестированию.
- Если вы используете Apache Deltaspike, вы можете использовать BeanProvider#getContextualReference. Это проще, чем получить javax.предприятие.впрыскивать.Пример, но остерегайтесь зависимых бобов (см. javadoc)!