jsf 2 - JSF: ¿cuál es la diferencia entre @PostConstruct y la llamada de método directo desde el constructor?
jsf-2 (1)
Desde mi punto de vista, gestionado con bean bean, necesito rellenar una lista con datos de DB. Estoy haciendo esto a través de una llamada directa del constructor, algo como esto:
public MyClass(){
list=populateFromDb();
}
pero este método se puede llamar en un método anotado @PostConstruct, como:
public MyClass(){
}
@PostConstruct
populateFromDb(){...}
¿Cuál es la diferencia entre esto?
Si el bean tiene un alcance de solicitud, @PostConstruct se ejecutará cada vez. Se llamará después de que se haya creado una instancia del bean administrado, pero antes de que se coloque en el alcance. Tal método no acepta argumentos, devuelve el valor nulo y no puede declarar que se lanza una excepción marcada. El método puede ser público, protegido, privado o paquete privado. Si el método lanza una excepción no verificada, la implementación de JSF no debe poner el bean administrado en servicio y no se llamarán más métodos en esa instancia de bean administrado.
public TrainingClassForm() {
}
@PostConstruct
public void init() {
if (this.trainingListModel.getListDataModel() != null) {
this.trainingListModel.getAllTrainingClasses();
}
}
Refiriéndote a esta cuestión de pila
En un bean administrado, se llama a @PostConstruct
después del constructor de objetos Java normal.
cuando se llama al constructor, el bean aún no está inicializado, es decir, no se inyectan dependencias. En el método @PostConstruct
, el bean está completamente inicializado y puede usar las dependencias
@PostConstruct
es el contrato que garantiza que este método se invocará solo una vez en el ciclo de vida del bean . Puede suceder (aunque sea poco probable) que el contenedor @PostConstruct
un bean varias veces en su funcionamiento interno, pero garantiza que se invocará @PostConstruct
solo una vez.
Si su clase realiza toda su inicialización en el constructor, entonces @PostConstruct
es de hecho redundante.
Sin embargo, si su clase tiene sus dependencias inyectadas usando métodos de establecimiento, entonces el constructor de la clase no puede inicializar completamente el objeto, y algunas veces es necesario realizar alguna inicialización después de que se hayan llamado a todos los métodos de establecimiento, de ahí el caso de uso de @PostConstruct
También vea esto y this