2014-08-27 2 views
11

Es gibt viele Initialisierungsoptionen im Frühjahr Bohnen Lebenszyklus.Spring: init-Methode, PostConstruct, afterPropertiesSet: Wann man eine über andere verwenden?

init-Methode, PostConstruct Anmerkung, afterPropertiesSet, Bean post-Initialisierung und sogar Klasse Konstruktor. All diese können zum Initialisieren einer Bean verwendet werden.

Ich war verwirrt, wenn man eins über anderen benutzt. Außerdem, müssen wir vielleicht alle diese Optionen in einer einzigen Bean verwenden? Wenn ja, bitte Beispiel wäre gut.

Ich freue mich wirklich darauf, ein paar tolle Antworten zu bekommen.

Antwort

13

Der Unterschied zwischen den Konstruktor und den anderen Optionen, dass die Konstruktorcode die erste ist, durchgeführt werden, während die anderen Optionen nur aufgerufen werden, nachdem Abhängigkeiten in den Bohnen injiziert wurden (entweder von @Autowired Annotationen oder die XML-Datei).

Code, den Sie im Konstruktor schreiben, wird ausgeführt, solange die Eigenschaften des Beans noch nicht initialisiert sind. Alle @Autowired Felder wären null. Manchmal ist dies das, was Sie möchten, aber normalerweise möchten Sie, dass der Code ausgeführt wird, nachdem die Eigenschaften festgelegt wurden.

Ansonsten sehe ich keinen Unterschied, anders als Reihenfolge der Ausführung. Ich glaube nicht, dass es einen Fall gibt, in dem Sie alle Optionen in derselben Klasse haben möchten.

6

Ich würde vorschlagen, dass Sie nur den Konstruktor verwenden, wo es möglich ist. Es ist ein sehr, sehr guter Grund, dies zu tun: Test

Wenn Sie Unit-Test einen Spring-Bean gehen, werden Sie wollen in der Lage sein, die Klasse mit minimalem Aufwand zu konstruieren. Das bedeutet, dass Sie nur den Konstruktor aufrufen müssen und sich nicht damit beschäftigen müssen, verschiedene Lebenszyklusmethoden selbst aufzurufen. Das letzte, was Sie wollen, wenn Sie die zu testende Klasse erstellen, ist zu wissen, wie das Objekt initialisiert wird.

Mit der Konstruktoreinspritzungsunterstützung von Spring können Sie einfach andere Beans oder Projekteigenschaften in den Konstruktor einspeisen, um so fast jedes Szenario abdecken zu können.

+0

Fast jedes Szenario, außer Fälle, in denen Sie keine Konstruktorinjektion (d. H. Zyklische Abhängigkeiten) verwenden können. In diesem Fall können Sie Bean nur mit @ PostConstruct und seinen Alternativen initialisieren. – hoaz

+0

@hoaz Das ist wahr – geoand

+1

Ich denke das [gute] Antwort bedeutet die Verwendung von "Constructor Injection", nur um klar zu sein ... Und wenn Sie diesen Weg gehen, ist es wahrscheinlich unklug, zusätzlich PostConstruct Annotationen (http: //stackoverflow.com/a/3406690/1357094) in derselben Klasse. Wenn dies weiterhin der Fall ist, wird die @ PostConstruct-Methode nicht in [d. H.] Vanille-JUnit-Tests aufgerufen, da Spring dort nicht involviert ist! – cellepo

Verwandte Themen