Spring Injection - доступ к внедренному объекту в конструкторе - PullRequest
7 голосов
/ 09 ноября 2010

У меня есть ресурс (Spring bean), в который Spring вводит некоторые поля, например:

@Repository(value="appDao")
public class AppDaoImpl implements AppDao {
   @PersistenceContext
   EntityManager entityManager;

   public Resource() {
      ... use entityManager ... // doesn't work
   }
}

Я знаю, что не могу получить доступ к внедренному entityManager в конструкторе и должен использовать аннотацию @PostConstruct для другого метода. Но каковы причины этого?

Ответы [ 2 ]

14 голосов
/ 09 ноября 2010

Поскольку Spring не может получить доступ ни к каким полям или методам до создания объекта (что делается с помощью конструктора).Таким образом, Spring создает объект с помощью конструктора, а затем вводит свойства.

Единственный способ обойти это - использовать Constructor Injection (что может быть неудобно, если у вас естьмножественные зависимости).Я думаю, что вы должны сделать, это переместить ваш код из конструктора в метод инициализации, используя аннотацию @PostConstruct :

@PostConstruct
public void init(){
    // do stuff with entitymanager here
}
4 голосов
/ 09 ноября 2010

Причина в жизненном цикле bean-компонента:

  • Контейнер (контекст приложения Spring) создает экземпляр объекта
  • , затем устанавливает все зависимости (в том числе entityManager вваш пример)
  • после того, как все зависимости были установлены, он вызывает метод @PostConstruct, если таковой имеется.

Spring (и никто) может задавать поля для объекта до того, как на самом делесоздание этого объекта.

Вы можете использовать конструктор-инъекцию - передача зависимостей в конструктор не по умолчанию, но это невозможно с @PersistenceContext

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