Ich habe eine Frage zur Reihenfolge der automatischen Verkabelung und zur Logik @PostConstruct
Im Frühjahr. Zum Beispiel habe ich folgenden Demo-Code für eine Spring Boot-Hauptklasse:
@SpringBootApplication
public class Demo1Application {
@Autowired
BeanB beanb;
public static void main(String[] args) {
SpringApplication.run(Demo1Application.class, args);
}
}
und 2 @Service
Definitionen:
@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();
}
}
und ich habe die folgende Ausgabe:
bohne a heißt
print me heißt in Bean B
beanb heißt
Meine Frage ist, wie Autowiring Schritt für Schritt wie in dem obigen Szenario abläuft.
Und wie wird die printMe()
-Methode von beanb
aufgerufen, ohne zuerst den @PostConstruct
Aufzurufen?
Unten sollte mögliche Reihenfolge sein
beanb
wird automatisch verkabeltBeanb
wird Beana automatisch verkabelt@PostConstruct
, D. H. init()
von Beana, aufgerufeninit()
wird System.out.println("bean a is called");
aufgerufenb.printMe();
aufgerufen, wodurch System.out.println("print me is called in Bean B");
ausgeführt wirdbeana
den @PostConstruct
Abgeschlossen hat, wird init()
von beanb
aufgerufenSystem.out.println("beanb is called");
aufgerufenIm Idealfall kann dasselbe von einem Debugger in Eclipse besser beobachtet werden.
Das Spring-Referenzhandbuch erklärt, wie zirkuläre Abhängigkeiten aufgelöst werden. Die Bohnen werden zuerst instanziiert und dann ineinander injiziert.
Ihre Antwort ist richtig, wie Sie in Ihrer Frage gezeigt haben.
Jetzt bekommen Sie das Konzept der Notation @Autowired
. Alle @Autowired
Objekte werden initialisiert und direkt nach dem Laden der Klasse in den Speicher geladen.
Hier ist dein SpringBootApplication
@SpringBootApplication
public class Demo1Application {
@Autowired
BeanB beanb; // You are trying to autowire a Bean class Named BeanB.
Hier oben in der Konsolenanwendung, die Sie geschrieben haben, versuchen Sie, ein Objekt vom Typ BeanB
automatisch zu verdrahten und zu injizieren.
Hier ist Ihre Definition von BeanB
@Service
public class BeanB {
@Autowired
private BeanA beana ;
In der Klasse BeanB
versuchen Sie, das Objekt der Klasse BeanA
zu injizieren, das auch in Ihrem Konsolenprojekt definiert ist.
Also, in deinem Demo1Application
Um ein Objekt der Klasse BeanB
zu injizieren, muss ein Objekt der Klasse BeanA
injiziert werden. Jetzt wird zuerst das Klassenobjekt BeanA
erstellt.
Nun, wenn Sie die Definition Ihrer Klasse sehen 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();
}
}
Also, nach dem Injizieren der Object BeanA
Methode binden mit @PostContruct
Annotation wird ausgeführt.
Also wird Ausführungsfluss sein ..
System.out.println("bean a is called");
System.out.println("print me is called in Bean B");
System.out.println("beanb is called");