2015-02-26 19 views
5

sto imparando usando le annotazioni Spring 4 di Java e non sono riuscito a trovare come impostare il metodo init predefinito su tutti i bean che appartengono a una configurazione specifica, senza aggiungere l'annotazione @PostContruct per inizializzare il metodo su tutte le clases e non renderle implementabili l'interfaccia InitializeBean ... voglio solo fare qualcosa di simile:come impostare il metodo init dei bean predefiniti mediante annotazioni nella primavera 4?

<beans default-init-method="init"> 

    <bean id="blogService" class="com.foo.DefaultBlogService"> 
    </bean> 

    <bean id="anotherBean" class="com.foo.AnotherBean"> 
    </bean> 

</beans> 

Quindi, voglio fare esattamente questo annotazioni Java, voglio impostare le configurazioni predefinite fagioli sul contenitore di configurazione del bean. È possibile? Cordiali saluti

MODIFICA: Quello che in realtà voglio fare è dire a molla di eseguire il metodo di "inizializzazione" di default su tutti i bean che creo all'interno di una classe BeansConfigurations. Significa, metti qualche annotazione o qualcosa che stabilisca che tutti i bean contenuti eseguiranno questo metodo di inizializzazione di default. Ma come ho detto prima, non voglio toccare le classi di bean, voglio dire, non voglio aggiungere l'annotazione @PostConstructor ad ogni metodo di inizializzazione per ogni classe di bean e non voglio che ogni bean implementi l'interfaccia InitializeBean sia

+0

Puoi guardare in 'BeanPostProcessor', ma puoi spiegare un po 'di più il tuo caso d'uso? Forse c'è un altro modo per arrivare allo stesso risultato – geoand

+0

Ho appena editato con più informazioni. Grazie! – jscherman

risposta

5

si potrebbe fare la seguente:

@Configuration 
public class SomeConfig { 

    @Bean(initMethod = "initMethodName") 
    public SomeBeanClass someBeanClass() { 
     return new SomeBeanClass(); 
    } 
} 

si potrebbe ripetere che per ogni chicco che si desidera chiamare initMethodName su.

Si potrebbe prendere un ulteriore passo avanti e attuare un meta-annotation come

@Bean(initMethod = "initMethodNAme") 
public @interface MyBean { 
} 

e semplicemente utilizzare @MyBean invece di @Bean(initMethod = "initMethodName") in SomeConfig

+0

Grazie! Non posso credere di non averlo visto nella documentazione. Comunque, in questo modo devo implementare il nome initMethod su ogni bean che ho dentro "SomeConfig" (usando il tuo esempio). Sai se esiste un modo per speficiare initMethod su tutta la configurazione? – jscherman

+1

Benvenuto! Quello che ho postato è il modo più semplice che riesco a pensare. Probabilmente potresti usare qualche tipo di 'BeanPostProcessor' insieme alla riflessione, ma ciò sarebbe molto più complicato. Tuttavia, se si utilizza la meta-annotazione che ho mostrato nella mia risposta, non è necessario specificare 'initMethod' per ogni bean. Basta sostituire '@ Bean' con' @ MyBean' e tutto è pronto – geoand

0

Se ho capito bene la tua domanda, si desidera che ogni chicco di eseguire il suo metodo init (se ne ha uno) senza dichiararli tutti nel file di configurazione. Penso che il tuo stesso post abbia già la risposta, è default-init-method="init". In side le classi di bean che vuoi inizializzare, implementa un metodo public void init() in ognuna di esse. Saranno tutti chiamati all'avvio dell'applicazione.

Problemi correlati