Внедрение зависимостей в Конструкторе - PullRequest
5 голосов
/ 29 декабря 2011

Предположим, у меня есть классы обслуживания Spring или компоненты JSF. Я провожу эти классы в другом классе. До сих пор нет проблем. Я могу использовать эти введенные поля в любом методе.

Но использование их в конструкторе дает мне исключение NullPointerException.

Вероятно, конструктор запускается до внедрения зависимостей и не видит мои введенные поля. Есть ли решение использовать внедрение зависимости в конструкторе?

Ответы [ 2 ]

4 голосов
/ 29 декабря 2011

Очевидно, что невозможно внедрить что-либо в объект, если этот объект не существует.И чтобы существовать, объект должен быть построен.

Spring поддерживает внедрение конструктора:

@Autowired
public SomeService(SomeDependency dep) {
    ...

Spring также поддерживает @ PostConstruct , что позволяет инициализировать бин после всехзависимости были введены.

Не знаю о JSF.

4 голосов
/ 29 декабря 2011

Нет, вы не можете ссылаться на вставленные поля в конструкторе. Фреймворк должен каким-то образом создать ваш объект (вызвать конструктор), а затем внедрить зависимости, чтобы они были пустыми во время выполнения конструктора. Вместо этого вы обычно применяете аннотацию @PostConstruct к одному из ваших методов и выполняете там инициализацию:

class MyBean {
  @Inject 
  private MyDependency myDep;

  @PostConstruct
  public void init() {
    assert myDep != null;
  }
}

В случае весенней конфигурации xml вы можете использовать init-method="init" вместо @PostConstruct в вашем <bean> определении. В качестве альтернативы вы можете использовать конструктор инъекций, в xml:

<bean id="myBean" class="my.package.MyBean">
  <constructor-arg ref="myDependency/>
</bean>

или эквивалент аннотации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...