2016-06-28 21 views
12

Ho una domanda sull'ordine di cablaggio automatico e sulla logica @PostConstruct in primavera. Per esempio seguente codice demo ho una classe principale molla di avvio:Ordine di autowiring di primavera e @PostConstruct

@SpringBootApplication 
public class Demo1Application { 

    @Autowired 
    BeanB beanb; 

    public static void main(String[] args) { 
     SpringApplication.run(Demo1Application.class, args); 
    } 
} 

e 2 @Service Definizioni:

@Service 
public class BeanB { 

    @Autowired 
    private BeanA beana ; 

    @PostConstruct 
    public void init(){ 
     System.out.println("beanb is called"); 
    } 

    public void printMe(){ 
     System.out.println("print me is called in Bean B"); 
    } 
} 

@Service 
public class BeanA { 

    @Autowired 
    private BeanB b; 

    @PostConstruct 
    public void init(){ 
     System.out.println("bean a is called"); 
     b.printMe(); 
    } 
} 

e ho il seguente output:

fagiolo una si chiama

stampa me è chiamato in Bean B

beanb si chiama


mia domanda è come autowiring avviene passo per passo come uno scenario di cui sopra?
E come viene chiamato il metodo printMe() di beanb senza chiamare prima il suo @PostConstruct?

risposta

8

Questi dovrebbe essere possibile sequenza

  1. beanb comincia ottenere autowired
  2. Durante classe inizializzazione Beanb, beana inizia ad ottenere autowired
  3. volta beana viene creato il @PostConstruct cioè init() di beana viene chiamato
  4. All'interno init(), System.out.println("bean a is called"); viene chiamato
  5. Poi b.printMe(); viene chiamato causando System.out.println("print me is called in Bean B"); per eseguire
  6. Avere la beana completato il @PostConstruct cioè init() di beanb viene chiamato
  7. Poi System.out.println("beanb is called"); viene chiamato

Idealmente lo stesso può essere meglio osservato da un debugger in Eclipse.

Il Spring reference manual spiega come vengono risolte le dipendenze circolari. I fagioli vengono prima istanziati, quindi iniettati l'uno nell'altro.

+1

[Link] (https://docs.spring.io/spring/docs/4.1.x/spring-framework-reference/html/beans. html # beans-dependency-resolution) alla risoluzione delle dipendenze circolare. –

3

La risposta è corretta come indicato nella domanda.

Ora Ottenere il concetto di notazione @Autowired. Tutti gli oggetti @Autowired vengono inizializzati e caricati in memoria subito dopo il caricamento della classe.

Ora qui è il vostro SpringBootApplication

@SpringBootApplication 
public class Demo1Application { 
    @Autowired 
    BeanB beanb; // You are trying to autowire a Bean class Named BeanB. 

Qui a sopra un'applicazione console che si deve scrivere cercare di autowire e iniettare un oggetto di tipo BeanB.

Ora qui è la tua definizione di BeanB

@Service 
public class BeanB { 

    @Autowired 
    private BeanA beana ; 

In BeanB classe che si sta cercando di iniettare l'oggetto della classe BeanA che è anche definito nel progetto di console.

Quindi, nel proprio Demo1Application per iniettare un oggetto della classe BeanB, è necessario inserire un oggetto della classe BeanA. Ora l'oggetto di classe BeanA viene creato per primo.

Ora, se si vede la definizione della classe BeanA

@Service 
public class BeanA { 

    @Autowired 
    private BeanB b; 

    @PostConstruct // after Creating bean init() will be execute. 
    public void init(){ 
     System.out.println("bean a is called"); 
     b.printMe(); 
    } 
} 

Così, Dopo aver iniettato il metodo Oggetto BeanA legano con @PostContruct annotazioni sta per eseguire.

Quindi, flusso di esecuzione sarà ..

System.out.println("bean a is called"); 
System.out.println("print me is called in Bean B"); 
System.out.println("beanb is called");