Anotación @PostConstruct y ciclo de vida de primavera
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 @Autowired
un campo anotado en otra clase. ¿ Puedo asumir que la clase solo se inyecta después de que @PostConstruct
se 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");
}
}
Si está preguntando si la inyección de una clase determinada ocurre después de que @PostConstruct
se llama a ese bean, entonces la respuesta es sí: @PostConstruct
se ejecuta antes de que el bean se considere "inyectable".
Si pregunta si @PostConstruct
un frijol dado se ejecuta después de que se hayan realizado todas las inyecciones (en el mismo frijol), entonces sí, @PostConstruct
se 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 @PostConstruct
acciones 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
El manejo de anotaciones como @PostConstruct
,, se realiza a través de un @Resource
BeanPostProcessor , 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
Sí. El flujo de trabajo de creación de beans es:
- llamada de constructor
@Autowired
campos@Autowired
colocadores- BeanPostProcessor's
postProcessBeforeInitialization()
, es decir,@PostConstruct
llamado porCommonAnnotationBeanPostProcessor
InitializingBean.afterPropertiesSet()
- BeanPostProcessor
postProcessAfterInitialization()
- El frijol está listo y se puede inyectar a otro frijol.