web-dev-qa-db-fra.com

@PostConstruct annotation et cycle de vie du ressort

Je suis nouveau au printemps, j'aimerais savoir:

J'ai une classe Java annotée avec @Component (spring) et à l'intérieur j'ai une méthode annotée avec @PostConstruct. La classe est ensuite référencée par @Autowired champ annoté dans une autre classe. Puis-je supposer que la classe n'est injectée qu'après l'appel de @PostConstruct?

@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")

  }

}
14
Daniele

Si vous demandez si l'injection d'une classe donnée a lieu après @PostConstruct dans ce bean est appelé, alors la réponse est oui - @PostConstruct est exécuté avant que le bean soit considéré comme "injectable"

Si vous demandez si @PostConstruct sur un bean donné est exécuté après que toutes les injections ont été effectuées (sur le même bean) - alors oui - @PostConstruct est exécuté après la validation des injections dans le bean donné. C'est la raison pour laquelle il existe. Normalement, vous pouvez mettre @PostConstruct actions dans le constructeur. Cependant, lorsqu'un nouvel objet est créé (le constructeur est appelé), les injections ne sont pas encore effectuées - donc toute initialisation qui dépend des objets injectés échouerait en raison de NPE. C'est pourquoi vous avez besoin de @PostConstruct

32
Antoniossss

La gestion des annotations telles que @PostConstruct, @Resource, @PreDestroy se fait via un BeanPostProcessor , dans ce cas le CommonAnnotationBeanPostProcessor . Vous pouvez voir dans le diagramme suivant de Spring que ces BPP sont traités après injection de dépendance mais avant Bean Ready For Use (Ce qui signifie autant que injectable).

enter image description here

16
Nico Van Belle