2016-09-11 5 views
0

У меня есть класс, который реализует реализацию интерфейса конфигурации через DI.Инъекционная зависимость на основе значения в файле конфигурации

@Inject 
private PRCConfiguration prcConfig; 

Существуют различные реализации интерфейса PRCConfiguration. В настоящее время он вводит реализацию по умолчанию. Я хочу создать значение в текстовом файле конфигурации, который определит, какую конкретную реализацию PRCCOnfiguration нужно вставить. Я хочу, чтобы запись @Inject проверила, какое значение находится в файле конфигурации, и на основе этого введет конкретную реализацию.

Я считаю, что мы можем аннотировать различные реализации через отборочные, а затем вводят, например,

@Inject @NewImplementation 
private PRCConfiguration prcConfig; 

Но опять же я инъекционного на compiletime упорным кодирования.

Мой конфигурационный файл будет что-то вроде

"injectconfig":"NewImplementation" 

впрыснуть реализацию @NewImplementation, впоследствии, если я хочу другой реализации, который будет введен. Я мог бы просто изменить значение файла конфигурации как

"injectconfig":"DifferentImplementation" 

и различные варианты осуществления будут введены.

Является ли это возможным с помощью CDI?

ответ

2

Вы можете использовать producer methods для достижения чего-то подобного.

В основном вам просто нужно создать CDI bean, который возвращает правильный экземпляр конфигурации и аннотирует его с помощью @Produces.

Что-то вроде этого:

@ApplicationScoped 
public class ConfigurationProducer { 

    @Produces 
    @ApplicationScoped 
    public PRCConfiguration getConfig() { 

     if(someCondition) { 
      return new NewConfigurationImpl(); 
     } 
     else { 
      return new OldConfigurationImpl(); 
     } 

    } 

} 

В этом случае вы должны аннотированный обе реализации с @Vetoed или вы получите неоднозначные зависимостей ошибок. Используя @Vetoed на реализациях, CDI сообщит, что использование производителя - единственный способ получить PRCConfiguration экземпляров.

+0

Большое спасибо приятелю! – Saad

+0

Снова +1 для @Vetoed, потратил бы несколько часов на отладку в противном случае, но он кажется только доступным в java ee 7? – Saad

+0

Jboss не может найти @Vetoed – Saad

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