Was ist das erwartete Verhalten von @PostConstruct in @Configuration-Klassen?
Sind wir wiederverwenden eines Projekts, definiert seine Bohnen mit spring java-config (mit @ - Konfiguration), und in einer solchen Klasse hat es eine @PostConstruct
init-Methode.
Was ist das erwartete Verhalten hier - Wann wird diese Methode aufgerufen? In Bezug auf Bohnen, das ist. I. e. funktioniert diese Methode Verhalten sich genau so, als ob die configuration-Klasse ist eine bean (und ist es eigentlich eines?)
Was wir beobachten, ist, dass, je nach Betriebssystem, es kann aufgerufen werden, bevor die Bohnen, die @Autowired
in die configuration-Klasse initialisiert werden, und somit endet die Arbeit mit unvollständigen Abhängigkeiten.
- Nach dem Konstruktor, und nach dem Autowiring von Abhängigkeiten abgeschlossen ist.
- Sie bemerkt Unterschiede dependending auf das Betriebssystem? Das ist ziemlich seltsam! Ich habe nicht auf irgendwelche solche Probleme, wenn ich
@PostContstruct
innen@Configuration
. Immer, wenn ich verwendet, es war genannt nach autowiring durchgeführt wurde - ja - manchmal ist es aufgerufen wird, bevor die abhängigen beans initialisiert werden, manchmal nach.
- Ich meinte in Bezug auf andere-Bohnen (ich aktualisierte die Frage)
- +1 ich habe keine Ideen, da ich noch nie das problem aufgetreten ist, und somit nicht wiedergeben kann), aber das Thema ist sehr interessant!
- in der Tat. Ich hatte noch nie dieses Problem mit regelmäßigen Bohnen, aber es ist das erste mal, dass ich mit java-config, und ich weiß nicht, Configuration-Klassen werden behandelt, wie Bohnen oder nicht.
- Eine Idee wäre, zu Debuggen und zu sehen, wenn die entsprechende post-Prozessoren genannt werden (wahrscheinlich
CommonAnnotationBeanPostProcessor
undAutowiredAnnotationBeanPostProcessor
)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sogar für
@Configuration
,@PostConstruct
sich so verhält, wie erwartet - es wird aufgerufen, nachdem die Abhängigkeiten der Klasse injiziert werden. Dies ist zwar ein bisschen verwirrend (zusammen mit der Tatsache, dass@Configuration
Klassen sind beans), ist es korrekt.Das problem an der hand war eine versteckte zirkuläre Abhängigkeit eingeführt, die mit Hilfe von spring-security-oauth - es ist eine verwickelte Reihe von Konfigurationen, die über den Rahmen dieser Diskussion.
So,
@PostConstruct
können geltend gemacht werden, wenn die abhängige Bohnen sind nicht vollständig initialisiert ist, nur im Falle von zyklischen Abhängigkeiten. Wenn Abhängigkeiten erfolgt über setter-oder Feld-Injektion die zirkuläre Abhängigkeit ist nicht gemeldet, und stattdessen unvollständige Bohnen verwendet werden.Auch etwas, was hier zu beachten ist, dass es scheint, die zirkuläre Abhängigkeit Behandlung hängt von der OS (was bedeutet, dass einige JVM oder JRE Unterschiede).