En un bean gestionado, @PostConstruct
se llama después del constructor de objetos Java normal.
¿Por qué usaría @PostConstruct
para inicializar por bean, en lugar del constructor regular en sí?
En un bean gestionado, @PostConstruct
se llama después del constructor de objetos Java normal.
¿Por qué usaría @PostConstruct
para inicializar por bean, en lugar del constructor regular en sí?
final
. Dado ese patrón, ¿por qué se@PostConstruct
agrega a J2EE, seguramente deben haber visto otro caso de uso?Respuestas:
porque cuando se llama al constructor, el bean aún no se inicializa, es decir, no se inyectan dependencias. En el
@PostConstruct
método, el bean está completamente inicializado y puede usar las dependencias.porque este es el contrato que garantiza que este método se invocará solo una vez en el ciclo de vida del bean. Puede suceder (aunque es poco probable) que un contenedor se instancia varias veces por el contenedor en su funcionamiento interno, pero garantiza que
@PostConstruct
se invocará solo una vez.fuente
El principal problema es que:
* obviamente excluyendo la inyección de constructor
Ejemplo del mundo real:
IMPORTANTE :
@PostConstruct
y@PreDestroy
se han eliminado por completo en Java 11 .Para seguir usándolos, deberá agregar el JAR javax.annotation-api a sus dependencias.
Maven
Gradle
fuente
in a constructor, the injection of the dependencies has not yet occurred.
verdadero con setter o inyección de campo, pero no verdadero con inyección de constructor.Si su clase realiza toda su inicialización en el constructor, entonces
@PostConstruct
es redundante.Sin embargo, si su clase tiene sus dependencias inyectadas usando métodos setter, entonces el constructor de la clase no puede inicializar completamente el objeto, y algunas veces es necesario realizar alguna inicialización después de haber llamado a todos los métodos setter, de ahí el caso de uso de
@PostConstruct
.fuente
Considere el siguiente escenario:
Dado que Car debe ser instanciado antes de la inyección de campo, el motor del punto de inyección sigue siendo nulo durante la ejecución del constructor, lo que resulta en una NullPointerException.
Este problema puede resolverse mediante la inyección de dependencia JSR-330 para la inyección del constructor Java o las anotaciones comunes JSR 250 para la anotación del método Java @PostConstruct.
@PostConstruct
JSR-250 define un conjunto común de anotaciones que se ha incluido en Java SE 6.
La anotación @PostConstruct permite la definición de los métodos que se ejecutarán después de que se haya instanciado la instancia y se hayan realizado todas las inyecciones.
En lugar de realizar la inicialización en el constructor, el código se mueve a un método anotado con @PostConstruct.
El procesamiento de los métodos posteriores a la construcción es una simple cuestión de encontrar todos los métodos anotados con @PostConstruct e invocarlos a su vez.
El procesamiento de los métodos posteriores a la construcción debe realizarse después de que se hayan completado la creación de instancias y la inyección.
fuente
Además, la inicialización basada en constructor no funcionará según lo previsto cuando se trate de algún tipo de representación remota o remota.
Se llamará al ct cada vez que se deserialice un EJB, y cada vez que se cree un nuevo proxy para él ...
fuente