2014-06-16 3 views
1

Простой вопрос, но я не могу его решить. Поскольку я знаю, что поля сначала инициализируются и после этого вызывается конструктор.CDI порядок инжекции и конструктор

Следующий код

public class Controller { 

     @Inject 
     private ReadCommand readCommand; 

     public Controller() { 
      if (readCommand==null){ 
       System.out.println("NO"); 
      }else{ 
       System.out.println("YES"); 
      }   
     } 
} 

печатает НЕТ. Но когда я закачиваю в конструктор

@Inject 
public Controller(ReadCommand readCommand) 

Он печатает ДА. Что я делаю не так?

ответ

5

Вы ничего не делаете неправильно. Конструктор вызывается много раз во время процесса впрыска. Поля вводятся в управляемый компонент только после его создания. Когда вы выполняете инъекцию уровня конструктора, ваш конструктор должен читать:

private ReadCommand readCommand; 

@Inject 
public Controller(ReadCommand readCommand) { 
    this.readCommand = readCommand; 
    if(this.readCommand == null) { 
     ... 
    } 
} 
+0

Спасибо за ваше время. Могу ли я вставлять в myField и получать myField в конструкторе таким образом, чтобы myField уже был инициализирован через контейнер CDI? –

+0

И не могли бы вы объяснить: «Конструктор вызывается много раз во время процесса инъекции». ? –

+0

Вы не можете получить его в конструкторе. Вы можете использовать обратный вызов @ @ PostConstruct из контейнера для выполнения инициализации после завершения инъекции. Конструктор может быть вызван несколько раз, поскольку объект, с которым вы имеете дело, является прокси-сервером. Обычно это не проблема для людей. –

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