Вопрос

Как я могу использовать JSR-299 CDI для инъекции (не аннотированных) бобов из внешних библиотек?

Примеры:

Интерфейс X и его реализации поступают от третьей стороны Lib. Как я могу решить, какую реализацию использовать?

class A {

    @Inject 
    private X x;

}

Что если бы у меня было несколько классов, используя интерфейс X, но разные реализации?

class A {

    @Inject 
    private X x; // should be XDefaultImpl

}

class B {

    @Inject 
    private X x; // should be XSpecialImpl

}
Это было полезно?

Решение

Используйте производителей:

public class ClassInABeanArchive {
    @Produces @SpecialX public X createSpecialX() {
        return new XSpecialImpl();
    }

    @Produces @DefaultX public X createDefaultX() {
        return new XDefaultImpl();
    }
}

Вам придется определить @SpecialX а также @DefaultX квалификаторы. и использовать их вместе с @Inject:

@Qualifier
@Retention(..)
@Target(..)
public @interface SpecialX {}

Если вам не нужно дифференцировать две реализации, пропустите часть квалификаторов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top