2016-06-28 13 views
12

Mam pytanie dotyczące kolejności automatycznego okablowania i logiki @PostConstruct na wiosnę. Na przykład poniższy kod demo mam główną klasę Wiosna boot:Wiosenna kolejność autowirowania i @PostConstruct

@SpringBootApplication 
public class Demo1Application { 

    @Autowired 
    BeanB beanb; 

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

i 2 @Service definicje:

@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(); 
    } 
} 

i mam następujący wynik:

fasola A nazywamy

drukuj mnie nazywa się Bean B

beanb nazywa


Moje pytanie brzmi jak autowiring odbywa się krok po kroku jak scenariuszu powyżej?
A jak nazywa się printMe() metoda beanb bez wywoływania jej @PostConstruct?

Odpowiedz

8

poniżej powinny być możliwą sekwencję

  1. beanb zaczyna się autowired
  2. Podczas klasy inicjalizacji Beanb, beana zaczyna się autowired
  3. Po beana zostanie utworzony @PostConstruct tj init() z beana pobiera nazywane
  4. Wewnątrz init(), zostaje wywołana
  5. Następnie b.printMe(); pobiera nazywane powodując System.out.println("print me is called in Bean B"); wykonać
  6. Mając beana zakończeniu @PostConstruct tj init() od beanb pobiera nazywane
  7. Następnie System.out.println("beanb is called"); pobiera nazywane

Idealnie samo można lepiej przestrzegane przez debuggera w Eclipse.

W obiekcie Spring reference manual wyjaśniono sposób rozwiązywania zależności cyklicznych. Ziarna są najpierw tworzone, a następnie wstrzykiwane do siebie.

+1

[Link] (https://docs.spring.io/spring/docs/4.1.x/spring-framework-reference/html/beans. html # bean-dependency-resolution) do rozwiązywania zależności zależnych. –

3

Twoja odpowiedź jest poprawna, jak pokazano w pytaniu.

Teraz pojmowanie pojęcia zapisu @Autowired. Wszystko @Autowired Obiekty są inicjowane i ładowane do pamięci zaraz po zakończeniu ładowania klas.

Teraz tutaj jest SpringBootApplication

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

Tutaj w powyższym wniosku Console, że trzeba pisać spróbować autowire i wstrzyknąć obiektu typu BeanB.

Teraz tutaj jest twoja definicja BeanB

@Service 
public class BeanB { 

    @Autowired 
    private BeanA beana ; 

W BeanB klasa próbujesz wstrzyknąć obiekt klasy BeanA który jest również zdefiniowane w projekcie konsoli.

Tak więc, W twoim Demo1Application, aby wstrzyknąć Obiekt klasy BeanB, konieczne jest wstrzyknięcie obiektu klasy BeanA. Teraz BeanA Obiekt klasy został utworzony jako pierwszy.

Teraz, jeśli patrz definicja klasie 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(); 
    } 
} 

tak, po wstrzyknięciu Object BeanA metody wiążą się z @PostContruct adnotacja ma zamiar wykonać.

Więc przepływu wykonanie będzie ..

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