Come chiamare un metodo dopo che l’inizializzazione del bean è completa?

Ho un caso d’uso in cui ho bisogno di chiamare un metodo (non statico) solo nel bean: una volta caricato ApplicationContext. Va bene, se utilizzo MethodInvokingFactoryBean per questo? O abbiamo una soluzione migliore?

Come nota a margine, utilizzo ConfigContextLoaderListener per caricare il contesto dell’applicazione nell’applicazione web. E voglio, che se il bean ‘A’ è istanziato, chiama una volta il metodoA ().

Come può essere fatto bene?

Puoi usare qualcosa come:

   

Questo chiamerà il metodo “init” quando il bean viene istanziato.

Per espandere il suggerimento @PostConstruct in altre risposte, questa è davvero la soluzione migliore, secondo me.

  • Mantiene il tuo codice disaccoppiato dall’API Spring (@PostConstruct è in javax. *)
  • Annota esplicitamente il tuo metodo init come qualcosa che deve essere chiamato per inizializzare il bean
  • Non è necessario ricordare di aggiungere l’attributo init-method alla definizione del bean spring, spring chiamerà automaticamente il metodo (presupponendo di registrare l’opzione annotation-config da qualche altra parte nel contesto, comunque).

Esistono tre diversi approcci da considerare, come descritto nel riferimento

Utilizza l’attributo metodo-init

Professionisti:

  • Non richiede bean per implementare un’interfaccia.

Contro:

  • Nessuna indicazione immediata questo metodo è necessario dopo la costruzione per garantire che il bean sia configurato correttamente.

Implementare InitializingBean

Professionisti:

  • Non è necessario specificare il metodo init o triggersre l’elaborazione della scansione / annotazione dei componenti.
  • Appropriato per i bean forniti con una libreria, in cui non vogliamo che l’applicazione che utilizza questa libreria si occupi del ciclo di vita dei bean.

Contro:

  • Più invasivo rispetto all’approccio metodo init.

Utilizzare l’annotazione Lifecyle JSR-250 @PostConstruct

Professionisti:

  • Utile quando si utilizza la scansione dei componenti per rilevare automaticamente i bean.
  • Rende chiaro che un metodo specifico deve essere utilizzato per l’inizializzazione. L’intento è più vicino al codice.

Contro:

  • Inizializzazione non più specificata centralmente nella configurazione.
  • È necessario ricordare di triggersre l’elaborazione delle annotazioni (che a volte può essere dimenticata)

Hai provato a implementare InitializingBean ? Sembra esattamente quello che stai cercando.

Il rovescio della medaglia è che il tuo bean diventa consapevole di Spring, ma nella maggior parte delle applicazioni non è così male.

È ansible distribuire un BeanPostProcessor personalizzato nel contesto dell’applicazione per farlo. Oppure, se non ti interessa implementare un’interfaccia Spring nel tuo bean, potresti usare l’interfaccia InitializingBean o la direttiva “init-method” (stesso link).

Per chiarire ulteriormente ogni confusione sui due approcci, ovvero l’uso di

  1. @PostConstruct e
  2. init-method="init"

Dall’esperienza personale, mi sono reso conto che l’uso di (1) funziona solo in un contenitore di servlet, mentre (2) funziona in qualsiasi ambiente, anche in applicazioni desktop. Quindi, se dovessi utilizzare Spring in un’applicazione standalone, dovresti usare (2) per eseguire tale “chiamata questo metodo dopo l’inizializzazione.