Domanda

Ho un caso d'uso in cui devo chiamare un metodo (non statico) nel bean solo una volta al caricamento dell'ApplicationContext.Va bene se utilizzo MethodInvokingFactoryBean per questo?Oppure 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" viene istanziato, basta chiamare il metodo A() una volta.

Come può essere fatto bene?

È stato utile?

Soluzione

È possibile usare qualcosa come:

<beans>
    <bean id="myBean" class="..." init-method="init"/>
</beans>

Questa chiamerà il metodo "init" quando il fagiolo viene creata un'istanza.

Altri suggerimenti

Per espandere su suggerimento @PostConstruct in altre risposte, questo è davvero la soluzione migliore, a mio parere.

  • Mantiene il vostro codice di disaccoppiato dalla API primavera (@PostConstruct è in javax. *)
  • Si annota in modo esplicito il metodo init come qualcosa che deve essere chiamato per inizializzare il fagiolo
  • Non è necessario ricordarsi di aggiungere l'attributo init-metodo per la sua definizione di fagioli di primavera, la primavera chiamerà automaticamente il metodo (supponendo che si registra l'opzione di annotazione-config da qualche altra parte nel contesto, in ogni caso).

Ci sono tre diversi approcci da considerare, come descritto nel riferimento

Utilizza l'attributo metodo init

Professionisti:

  • Non richiede bean per implementare un'interfaccia.

Contro:

  • Non è richiesta alcuna indicazione immediata di questo metodo dopo la costruzione per garantire che il bean sia configurato correttamente.

Implementare l'inizializzazione del Bean

Professionisti:

  • Non è necessario specificare il metodo di inizializzazione o attivare la scansione dei componenti/l'elaborazione delle annotazioni.
  • Appropriato per i bean forniti con una libreria, dove non vogliamo che l'applicazione che utilizza questa libreria si preoccupi del ciclo di vita del bean.

Contro:

  • Più invasivo dell'approccio con il metodo init.

Utilizzare JSR-250 @PostConstruct annotazione del ciclo di vita

Professionisti:

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

Contro:

  • L'inizializzazione non viene più specificata centralmente nella configurazione.
  • Devi ricordarti di attivare l'elaborazione delle annotazioni (che a volte può essere dimenticata)

Hai provato attuazione InitializingBean ? Sembra esattamente quello che stai cercando.

Lo svantaggio è che il bean diventa Primavera-aware, ma nella maggior parte delle applicazioni che non è così male.

Si potrebbe distribuire un personalizzato BeanPostProcessor nel contesto applicativo per farlo. Oppure, se non ti dispiace l'attuazione di un'interfaccia di primavera nel vostro fagioli, è possibile utilizzare il InitializingBean interfaccia o la "direttiva init-metodo"(stesso link).

Per eliminare ulteriormente qualsiasi confusione sull'uso cioè due approccio

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

Per esperienza personale, mi sono reso conto che l'uso (1) funziona solo in un servlet container, mentre (2) funziona in qualsiasi ambiente, anche in applicazioni desktop. Quindi, se si sarebbe utilizzando Primavera in un'applicazione stand-alone, si dovrebbe usare (2) per realizzare che "chiamano questo metodo dopo l'inizializzazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top