2014-12-27 34 views
5

Sto riscontrando qualche problema nel far applicare una determinata configurazione Spring nell'ordine desiderato con Spring Boot in un progetto Maven a più moduli.Ordine di configurazione automatica avvio a molla

devo moduli A e B che sono scritti da me e una dipendenza da un modulo di terze parti che non ho alcun controllo su nel modulo C (le dipendenze sono i seguenti: A dipende da C, B dipende A)

Nel modulo AI ha una classe annotata con @Configuration e anche @AutoConfigureBefore(ClassFromModuleD.class). Nel modulo BI ho un'altra classe annotata con @Configuration e anche @AutoConfigureBefore(ClassFromModuleA.class)

Speravo che ciò avrebbe comportato la definizione delle definizioni di bean nel mio modulo B, seguita da bean nel mio modulo Una classe di configurazione quindi finalmente quelle in C

Ho anche provato ad aggiungere un file META-INF/spring.factories a entrambi i moduli A e B che dichiara il singolo file di configurazione presente nel proprio modulo. Per esempio. per il modulo A

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.exmaple.moduleAConfiguration

e nel modulo B:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.exmaple.moduleBConfiguration

non sto vedendo l'ordine desiderato di configurazione, infatti, sembra essere l'esatto contrario di quello che voglio . Ho usato le istruzioni di registrazione e un debugger e sembra che la configurazione del modulo C sia stata applicata per prima, seguita da A e infine B.

Qualcuno potrebbe indicare cosa ho perso o se c'è un altro modo per Fai questo? grazie mille in anticipo

+0

Potete mostrare la vostra classe di configurazione principale? Cosa intendi per "configurato" (come fai a sapere che una cosa viene prima di un'altra in euntime)? –

+0

La classe di configurazione principale appare così: '@EnableReactor @SpringBootApplication public class SpringConfiguration {} ' Credo che l'ordine non è quello che desidero perché ho messo i punti di interruzione nei vari metodi di definizione e fagioli non vengono colpiti nell'ordine in cui speravo. Il problema è che un bean nel modulo C prova a cercare un bean nel contesto che non è ancora lì perché è configurato dai moduli A e B che non sono ancora stati autoconfigurati ... Se passo il codice viene eseguito per modulo C e poi qualche tempo dopo i bean vengono configurati (troppo tardi)! –

+0

Le annotazioni 'AutoconfigureBefore/After' si applicano solo all'ordine in cui le classi vengono importate nel bean factory. Non dicono nulla sull'ordine di creazione dei bean, quindi i punti di rottura non aiutano realmente a capire il problema. Se non è possibile creare un bean, deve esserci un errore e una traccia dello stack, quindi forse sarebbe utile pubblicarli? –

risposta

0

Spring AutoConfiguration viene utilizzato per fornire una configurazione di base se alcune classi si trovano nel classpath o meno.

Viene utilizzato ad es. per fornire una configurazione Jpa di base se Hibernate si trova sul classpath.

Se si desidera configurare l'ordine in cui i fagioli sono istanziati entro la primavera è possibile utilizzare

@DependsOn("A") 
public class B{ 
...  
} 

Ciò creerebbe fagiolo "A", che "B".

Tuttavia, l'ordine desiderato potrebbe non essere possibile. Hai scritto:

A dipende da C, B dipende da una

Se 'dipende' significa: A deve C per essere istanziati, i fagioli devono essere creati nel seguente ordine:

  1. C - perché C dipende da nulla
  2. A - perché A dipende da C, che è già stato creato.
  3. B - perché B dipende da A, che è già stato creato.

Spring rileva automaticamente le dipendenze analizzando le classi di bean.

Se A ha una proprietà autowired o un argomento cosntructor di tipo C, la primavera 'sa' che deve istanziare C prima di A.

Nella maggior parte dei casi questo funziona bene.

In alcuni casi la molla non può "indovinare" le dipendenze e crea i bean in un ordine indesiderato. Quindi è possibile "informare" tramite l'annotazione @DependsOn sulla dipendenza. Spring proverà a cambiare l'ordine di conseguenza.

Nel tuo caso, se le dipendenze hai descritto non sono visibili per la primavera, e le dipendenze non sono necessari per creare i fagioli, si può provare a cambiare l'ordine con @DependsOn:

A dipende C, B dipende da una

potrebbe essere raggiunto con

@DependsOn("C") 
public class A{ 
    ...  
} 

@DependsOn("A") 
public class B{ 
    ...  
} 

// C comes from another module 
// and no need to annotate 
Problemi correlati