Как вводить бобы из внешних библиотек с помощью CDI? - PullRequest
7 голосов
/ 03 июня 2010

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

Примеры:

Интерфейс 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

}

1 Ответ

8 голосов
/ 03 июня 2010

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

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 {}

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

...