Spring: assicurati che un determinato bean venga inizializzato per primo

Ho una libreria che esegue la configurazione del runtime e la configurazione di log4j (nessun log4j.properties o log4j.xml). Ho definito un bean con class chiamato MyLoggerFactory e voglio che questo sia il primo bean da inizializzare usando spring. Ho visto che è già stato inoltrato un problema con la spring per supportare l’ordine di inizializzazione, ma mi chiedevo se esistesse un modo per contrassegnare un bean come il primo bean da inizializzare con il contenitore a molla?

Le tue opzioni sono:

  1. Utilizzare @DependsOn annotazione @DependsOn (disponibile dopo la spring 3.0.x) o depends-on attributo xml-dipendente e fare in modo che tutte le classi che utilizzano i logger configurati dipendano dalla fabbrica del logger
  2. Rendi la fabbrica una vera fabbrica per i logger e inietta i logger nei bean invece di chiamare direttamente la factory – questo è essenzialmente lo stesso dell’opzione 1, eccetto che la dipendenza è implicita. Questa è l’opzione che consiglierei.
  3. Spostare il codice di inizializzazione in una parte del codice in cui è specificato l’ordine di chiamata: il metodo main() o un ServletContextListener registrato prima di quello che inizializza Spring.

Non c’è modo di definire in modo esplicito l’ordine di inizializzazione in spring e probabilmente non lo sarà mai – non c’è modo di definire una semantica utile considerando che è ansible caricare molti file di configurazione del contesto dell’applicazione che potrebbero avere ordinamenti in conflitto. Devo ancora vedere un caso in cui l’ordinamento desiderato non può essere ottenuto rifattorizzando il codice per adattarsi meglio al modello di iniezione delle dipendenze.

Puoi @Autowired una @Configuration nella configurazione principale @

 @Configuration @Import(BusinessConfig.class, EarlyBeans.class) public class MainConfiguration { // The bean defined in EarlyBean will be loaded before // most beans references by MainConfiguration, // including those coming from BusinessConfig @Autowired EarlyBean earlyBean; } @Configuration public class EarlyBeans { @Bean public Void earlyBean(ApplicationContext appContext) { // .getBeansOfType allows to call for beans which might not exist appContext.getBeansOfType(TechnicalBean.class); return null; } } 

Questa è una funzionalità richiesta ma non risolta. È ansible utilizzare dipende ma è troppo prolisso. Segui il link per maggiori informazioni: https://jira.springsource.org/browse/SPR-3948

È ansible dividere il contesto dell’applicazione come multiplo e utilizzare l’importazione nel contesto dell’applicazione principale. È ansible inserire le impostazioni dell’ambiente principale prima nell’ordine di importazione e quindi continuare ad aggiungere altri file.

Potrebbe essere come sotto.