webentwicklung-frage-antwort-db.com.de

Spring Autowiring Order und @PostConstruct

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?

25
cacert

Unten sollte mögliche Reihenfolge sein

  1. beanb wird automatisch verkabelt
  2. Während der Klasseninitialisierung von Beanb wird Beana automatisch verkabelt
  3. Sobald Beana erstellt wurde, wird @PostConstruct, D. H. init() von Beana, aufgerufen
  4. Innerhalb von init() wird System.out.println("bean a is called"); aufgerufen
  5. Dann wird b.printMe(); aufgerufen, wodurch System.out.println("print me is called in Bean B"); ausgeführt wird
  6. Nachdem beana den @PostConstruct Abgeschlossen hat, wird init() von beanb aufgerufen
  7. Dann wird System.out.println("beanb is called"); aufgerufen

Im 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.

14
Mudassar

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");
5
Vikrant Kashyap