2015-02-25 1 views
0

У меня есть интерфейс и реализация его так;Wildfly 8 и сварка инъекции CDI через метод провайдера не влечет задержка

interface MyInterface { 
    public void doSomething(); 
} 


@Alternative 
class MyImpl implements MyInterface { 
    @Inject DB db; 

    public void doSomething() { 
    // db.select .... 
    } 
} 

Так как я хочу, чтобы иметь возможность изменить свой Databse через конфигурационный файл я использую метод провайдера для генерации об осуществлении

@Singleton 
public class MyApiProvider { 

    @Produces 
    public MyInterface getMyApi() { 
     return new MyImpl(); 
    } 
} 

Дело в том, что, когда класс MyImpl производится с помощью метода getMyApi «@Inject DB db;» в классе MyImpl имеет значение null.

Так что я хочу просто настроить, какую реализацию использовать во время выполнения.

EDIT: Когда я удалить @Alternative и удалить класс поставщика/метод все работает, как и ожидалось ..

EDIT 2: Я хотел бы сказать, мой веб-приложение из конфигурационного файла, класс реализации MyInterface, который я хочу использовать сегодня. Завтра, может быть, мне нужна другая реализация, и я не хочу перекомпилировать весь проект.

ответ

0

Вы можете использовать метод производителя, который выбирает конкретную реализацию на основе свойства/параметра:

@Produces 
public MyInterface myInterface(MyImplA a, MyImplB b) { 
    return (propertyValueA) ? a : b; 
} 

поскольку случаи а и Ь требуемые по методу производителя, они будут созданы контейнером и, таким образом, будут использоваться инъекции.

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

1

Это происходит потому, что вас создают класс MyImpl, а не позволяют реализовать CDI.

Когда CDI контролирует жизненный цикл объекта, вы получаете инъекцию (и другую обработку аннотации).

Возможно, что вы ищете @Qualifier.

Специфические @Alternative s могут быть указаны в файле beans.xml.

В качестве альтернативы, вы можете попробовать что-то вроде:

@ApplicationScoped 
public class Configuration { 

    public String getMyInterfaceImpl() { 
     // property file loading logic 
    } 

} 

public class SomeClient { 

    @Inject @Named("#{configuration.myInterfaceImpl}") 
    private MyInterface myInterface; 

    ... 

} 
+0

Хм .. я вижу. Я хотел бы иметь файл свойств, где я мог бы сказать, что для MyInterface используйте MyImpl.class или в другой солнечный день используйте MyImpl2.class. – KIC

+0

Отборочный код, насколько я понял, также закодирован в коде. Если я хочу, чтобы swich мой класс реализации, я должен перекомпилировать весь проект правильно? – KIC

Смежные вопросы