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")
}
}
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
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).