В управляемом компоненте @PostConstruct вызывается после обычного конструктора объектов Java.
Почему я должен использовать @PostConstruct для инициализации с помощью bean, а не самого обычного конструктора?
Переведено автоматически
Ответ 1
потому что при вызове конструктора компонент еще не инициализирован, т. Е. Никакие зависимости не вводятся. В методе @PostConstruct компонент полностью инициализирован, и вы можете использовать зависимости.
потому что это контракт, который гарантирует, что этот метод будет вызван только один раз в жизненном цикле компонента. Может случиться (хотя и маловероятно), что экземпляр компонента создается контейнером несколько раз при его внутренней работе, но это гарантирует, что @PostConstruct будет вызван только один раз.
Ответ 2
Вы всегда должны отдавать предпочтение внедрению конструктора, но с учетом сказанного, если по какой-либо причине вам приходится использовать внедрение поля, в этом случае основная проблема заключается в том, что:
в конструкторе внедрение зависимостей еще не произошло
Пример
publicclassFoo {
@Inject Logger LOG;
@PostConstruct publicvoidfooInit(){ LOG.info("This will be printed; LOG has already been injected"); }
publicFoo() { LOG.info("This will NOT be printed, LOG is still null"); // NullPointerException will be thrown here } }
Если ваш класс выполняет всю свою инициализацию в конструкторе, то @PostConstruct действительно избыточен.
Однако, если в ваш класс внедрены зависимости с использованием методов setter , то конструктор класса не может полностью инициализировать объект, и иногда некоторую инициализацию необходимо выполнить после вызова всех методов setter, отсюда и вариант использования @PostConstruct.
Ответ 4
Также инициализация на основе конструктора не будет работать должным образом всякий раз, когда задействовано какое-либо проксирование или удаленное взаимодействие.
Ct будет вызываться всякий раз, когда EJB десериализуется, и всякий раз, когда для него создается новый прокси...