Anotación @PostConstruct y ciclo de vida de primavera

Resuelto Daniele asked hace 7 años • 3 respuestas

Soy nuevo en Spring, me gustaría saber:

Tengo una clase java anotada con @Component(spring) y dentro tengo un método anotado con @PostConstruct. Luego, se hace referencia a la clase mediante @Autowiredun campo anotado en otra clase. ¿ Puedo asumir que la clase solo se inyecta después de que @PostConstructse llama?

@Component
class AuthenticationMetrics {

    private static final MetricRegistry metrics = new MetricRegistry();

    final Counter requestsTotal;

    final Meter guestLogins;

    final Meter kfUserLogins;

    final Timer guestLoginResponseTime;

    final Timer kfLoginResponseTime;

    @PostConstruct
    public void populateMetricsRegistry() {
        metrics.counter("authentication.requests.totals");
    }
}
Daniele avatar Jun 21 '17 23:06 Daniele
Aceptado

Si está preguntando si la inyección de una clase determinada ocurre después de que @PostConstructse llama a ese bean, entonces la respuesta es sí: @PostConstructse ejecuta antes de que el bean se considere "inyectable".

Si pregunta si @PostConstructun frijol dado se ejecuta después de que se hayan realizado todas las inyecciones (en el mismo frijol), entonces sí, @PostConstructse ejecuta después de que las inyecciones se hayan comprometido en el frijol dado. Ésta es la razón por la que existe. Normalmente podrías poner @PostConstructacciones en el constructor. Sin embargo, cuando se crea un nuevo objeto (se llama al constructor), las inyecciones aún no se realizan, por lo que cualquier inicialización que dependa de los objetos inyectados fallaría debido a NPE. Por eso necesitas@PostConstruct

Antoniossss avatar Jun 21 '2017 16:06 Antoniossss

El manejo de anotaciones como @PostConstruct,, se realiza a través de un @ResourceBeanPostProcessor , en este caso CommonAnnotationBeanPostProcessor . Puede ver en el siguiente diagrama de Spring que estos BPP se manejan después de la inyección de dependencia pero antes (lo que significa tanto como inyectables).@PreDestroy Bean Ready For Use

ingrese la descripción de la imagen aquí

Nico Van Belle avatar Jun 21 '2017 17:06 Nico Van Belle

Sí. El flujo de trabajo de creación de beans es:

  1. llamada de constructor
  2. @Autowiredcampos
  3. @Autowiredcolocadores
  4. BeanPostProcessor's postProcessBeforeInitialization(), es decir, @PostConstructllamado porCommonAnnotationBeanPostProcessor
  5. InitializingBean.afterPropertiesSet()
  6. BeanPostProcessorpostProcessAfterInitialization()
  7. El frijol está listo y se puede inyectar a otro frijol.
Vitalii avatar May 25 '2021 16:05 Vitalii