2014-08-27 25 views
11

Ci sono molte opzioni di inizializzazione disponibili nel ciclo di vita del bean spring.Spring: metodo init, PostConstruct, afterPropertiesSet: quando usarne uno su altri?

init-metodo, PostConstruct annotazione, afterPropertiesSet, Fagiolo post-inizializzazione e anche di classe costruttore. Tutti questi possono essere utilizzati per inizializzare un bean.

Mi sono confuso quando usarne uno su altro. Inoltre, è possibile che dovremmo usare tutte queste opzioni in un singolo bean? Se sì, per favore, l'esempio sarebbe buono.

Davvero non vedo l'ora di ottenere delle ottime risposte.

risposta

13

La differenza tra utilizzando il costruttore e le altre opzioni è che il codice del costruttore è il primo ad essere eseguito, mentre le altre opzioni verranno richiamati solo dopo dipendenze sono stati iniettati nel fagiolo (sia da @Autowired annotazioni o il file XML).

Il codice che scrivi nel costruttore verrà eseguito mentre le proprietà del bean non vengono ancora avviate. Tutti i campi @Autowired sono null. A volte questo è quello che vuoi, ma di solito vuoi che il codice venga eseguito dopo che le proprietà sono state impostate.

Oltre a questo, non vedo alcuna differenza, altro quindi l'ordine di esecuzione. Non penso che ci sia un caso in cui vorresti avere tutte le opzioni nella stessa classe.

6

Suggerisco di utilizzare il costruttore solo laddove possibile. C'è una ragione molto buona per farlo: test

Quando si va a testare un fagiolo di primavera, si vorrà essere in grado di costruire la classe con il minimo sforzo. Ciò significa che dovresti solo chiamare il costruttore e non dover gestire autonomamente i vari metodi del ciclo di vita. L'ultima cosa che vuoi quando crei la classe da testare è sapere come viene inizializzata la proprietà dell'oggetto.

Con il supporto per l'iniezione del costruttore di Spring è possibile iniettare facilmente altri bean o proprietà di progetto nel costruttore per poter coprire quasi tutti gli scenari.

+0

Quasi tutti gli scenari, tranne i casi in cui non è possibile utilizzare l'iniezione del costruttore (cioè le dipendenze cicliche). In questo caso, l'unico modo per inizializzare il bean è '@ PostConstruct' e le sue alternative. – hoaz

+0

@hoaz È vero – geoand

+1

Penso che questa [buona] Risposta implichi l'uso di "Iniezione del Costruttore", solo per essere chiari ... E se segui questa strada, è probabilmente imprudente aggiungere anche annotazioni PostConstruct (http: //stackoverflow.com/a/3406690/1357094) nella stessa classe. Se lo fa ancora, il metodo @PostConstruct non verrebbe chiamato in [i.e:] vanilla JUnit test perché Spring non è coinvolto lì! – cellepo

Problemi correlati