Как внедрить bean-компоненты из внешних библиотек с помощью CDI?

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

Примеры:

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

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

}

person deamon    schedule 03.06.2010    source источник


Ответы (1)


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

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

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

person Bozho    schedule 03.06.2010
comment
Я представил это. Оно было не очень хорошего качества, но основные функции работали нормально :) Я сделал образец приложения jsf2, чтобы продемонстрировать некоторые функции. Все остальные прошли модульное тестирование. Теперь я планирую выступить с докладом о CDI перед BG JUG. Посмотрим :) - person Bozho; 03.06.2010
comment
(code.google.com/p/blinkframework это здесь, но не производственный интерес :) ) - person Bozho; 03.06.2010
comment
Использование аннотации со строковым параметром (httpParm(foo)) описано в документации по сварке (но не соответствует непосредственно JSR-330): docs.jboss.org/weld/reference/1.0.0/en-US/html_single/#d0e1540 - person Thorbjørn Ravn Andersen; 13.01.2011
comment
да, с юзкейсом были какие-то странности. Но как это связано с этим ответом/вопросом? - person Bozho; 13.01.2011
comment
Зависит от того, хочет ли OP решить, какую реализацию использовать на основе квалификатора клиента или нет. - person Thorbjørn Ravn Andersen; 13.01.2011