В управляемом компоненте @PostConstruct
вызывается после обычного конструктора объектов Java.
Почему я использовал @PostConstruct
бы инициализацию с помощью bean-компонента вместо обычного конструктора?
В управляемом компоненте @PostConstruct
вызывается после обычного конструктора объектов Java.
Почему я использовал @PostConstruct
бы инициализацию с помощью bean-компонента вместо обычного конструктора?
final
. Учитывая этот шаблон, почему@PostConstruct
он добавляется в J2EE - они наверняка видели другой вариант использования?Ответы:
потому что, когда вызывается конструктор, бин еще не инициализирован, т.е. не вводятся зависимости. В
@PostConstruct
методе компонент полностью инициализирован, и вы можете использовать зависимости.потому что это контракт, который гарантирует, что этот метод будет вызываться только один раз в жизненном цикле компонента. Может случиться (хотя и маловероятно), что контейнер во время своей внутренней работы несколько раз создается экземпляром контейнера, но это гарантирует, что
@PostConstruct
он будет вызван только один раз.источник
Основная проблема заключается в том , что:
* очевидно, исключая конструктор инъекций
Пример из реальной жизни:
ВАЖНО :
@PostConstruct
и@PreDestroy
были полностью удалены в Java 11 .Чтобы продолжать использовать их, вам нужно добавить JAR-файл javax.annotation-api в ваши зависимости.
специалист
Gradle
источник
in a constructor, the injection of the dependencies has not yet occurred.
true с установщиком или внедрением поля, но не верно с внедрением конструктора.Если ваш класс выполняет всю свою инициализацию в конструкторе, то
@PostConstruct
он действительно избыточен.Однако, если ваш класс имеет свои зависимости, введенные с использованием методов установки, тогда конструктор класса не может полностью инициализировать объект, и иногда некоторая инициализация должна выполняться после того, как все методы установки были вызваны, отсюда и пример использования
@PostConstruct
.источник
Рассмотрим следующий сценарий:
Так как Car должен быть создан перед внедрением поля, механизм точки инжекции все еще равен нулю во время выполнения конструктора, что приводит к исключению NullPointerException.
Эта проблема может быть решена либо с помощью внедрения зависимостей JSR-330 для внедрения в конструктор Java, либо с помощью общих аннотаций JSR 250 для аннотации метода Java @PostConstruct.
@PostConstruct
JSR-250 определяет общий набор аннотаций, который был включен в Java SE 6.
Аннотация @PostConstruct позволяет определять методы, которые должны быть выполнены после того, как экземпляр был создан и все инъекции были выполнены.
Вместо выполнения инициализации в конструкторе код перемещается в метод, аннотированный @PostConstruct.
Обработка методов после конструирования - это простой вопрос поиска всех методов, аннотированных @PostConstruct, и последующего их вызова.
Обработка методов после конструирования должна выполняться после того, как реализация и внедрение были завершены.
источник
Кроме того, инициализация на основе конструктора не будет работать так, как задумано, когда задействован какой-либо тип прокси или удаленного взаимодействия.
Ct будет вызываться всякий раз, когда EJB десериализуется, и всякий раз, когда для него создается новый прокси ...
источник