Подтвердить что ты не робот

Как программно внедрить управляемый компонент Java CDI в локальную переменную (статическим) методом

Как я могу программно внедрить управляемый Java CDI 1.1+ bean в локальную переменную в статическом методе?

4b9b3361

Ответ 1

Чтобы ввести экземпляр класса C:

javax.enterprise.inject.spi.CDI.current().select(C.class).get()

Это доступно в CDI 1.1 +

Ответ 2

Используйте, например, эту утилиту class. В основном вам нужно получить экземпляр BeanManager, а затем взять из него нужный вам боб (представьте что-то вроде поиска JNDI).

Обновление

Вы также можете использовать служебный класс CDI, предлагаемый в CDI 1.1

SomeBean bean = CDI.current().select(SomeBean.class).get();

Обновление 2

В CDI 2.0 вы должны использовать класс BeanManager для программного получения экземпляров компонентов.

Ответ 3

@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;
    }
}

Ответ 4

Ссылка, предложенная @Petr Mensik, очень полезна. Я использую тот же код в моем примере.

Вот способ получить экземпляр класса в методах экземпляра/статических методах. Всегда лучше кодировать интерфейсы вместо использования имени класса, жестко закодированного в методах.

@Named(value = "iObject ")
@RequestScoped
class IObjectImpl  implements IObject  {.....}

//And in your method

IObject iObject = (IObject) ProgrammaticBeanLookup.lookup("iObject");
.........
//Invoke methods defined in the interface

Этот программный поиск beans может оказаться весьма полезным, если у вас есть объект с областью приложения с методом, для которого требуется экземпляр класса, который может меняться со временем. Таким образом, всегда лучше извлекать интерфейс и использовать программный bean для поиска свободной связи.

Ответ 5

Вы должны включить квалификаторы:

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

Ответ 6

  • Вы можете определить параметр с типом интерфейса компонента вваш статический метод и передайте соответствующую ссылку на реализацию. Это сделало бы его более дружественным к юнит-тестированию.
  • Если вы используете Apache Deltaspike, вы можете использовать BeanProvider # getContextualReference. Это проще, чем получить javax.enterprise.inject.Instance, но остерегайтесь зависимых компонентов (см. Javadoc)!