Überblick
Im vorherigen Artikel wird eingeführt, dass Sie, wenn Sie sich in eine Bean injizieren, wenn Sie @aSync und @Transaction haben, wenn Sie sich @autowire injizieren, eine kreisförmige Abhängigkeit melden. Wenn Sie sich beanfactoryaware injizieren, ist @Transaction ungültig. Zum Beispiel:
@ServicePublic Class myService implementiert BeanfactoryAware {private myService self; // Die Transaktionsannotation ist ungültig. }}Ich habe es gerade kurz erwähnt, und dieser Artikel soll vorstellen, warum es fehlgeschlagen ist.
Allgemein
Die folgenden Bedingungen müssen in der obigen Situation erfüllt werden:
Das Ergebnis ist: Mit Ausnahme von @aSync wirkt sich die Annotation aus, und keine anderen wirksam, wie in der folgenden Abbildung gezeigt
Der normale Proxy sollte die folgende Abbildung sein:
Grund
Das erste, was mir in den Sinn kommt, ist, dass sich die Verarbeitungsmethode der @aSync -Annotation von anderen unterscheidet. Bei der Implementierung von AsyncannotationBeanPostProcessor (der spezifische Code befindet sich in seiner übergeordneten Klasse.
Unter normalen Umständen ist die einkommende Bohne bereits eine dynamische Proxy -Klasse, die proxyiert wird, und wenn sie fehlschlägt, ist die tatsächliche Klasse, die einkommt, tatsächlich, wie in der folgenden Abbildung gezeigt:
Nachdem er den Code analysiert hat, wenn es sich um eine tatsächliche Klasse handelt, gibt es beim Erreichen von Zeile 69 das true zurück und fügen Sie dem dynamischen Prinzip den Berater von @aync hinzu. Wenn es sich um eine tatsächliche Klasse handelt, erstellt sie bei der Erreichung von Zeile 83 eine Proxy -Klasse und fügt nur den Berater von @aync zum dynamischen Proxy hinzu, sodass @Transaction bereits ungültig ist.
Warum kommen die Agenten nicht herein?
Tatsächlich ist der einzige Unterschied, ob Sie sich über beanfactoryaware erhalten haben. Warum verwenden Sie dann Beanfactory, um sich selbst zu bekommen, und dann sind Sie kein Proxy im nachfolgenden BeanPostProcessor? Wenn Sie mit dem Spring @Transaction -Lademechanismus vertraut sind, wissen Sie, dass dynamische Proxyerstellung wie @Transaction und @Retryable Annotations in AnnotationAwArepectJautoproxyCreator erstellt werden. Durch Debugg stellten wir fest, dass unser dynamischer Proxy nicht hinzugefügt wurde, nachdem sie AnnotationAwareasspectjautoproxyCreator durchlaufen hatte.
Werfen wir einen Blick auf die Implementierung in AnnotationAwareasspectjautoproxyCreator, aber danach wurde keine Proxy -Klasse generiert. Der Grund dafür ist, dass in der Karte, die im Voraus freigelegt wurde, "MyService" enthält.
Wann wurde er entlarvt? Eigentlich ist es
@Overridepublic void setbeanFactory (beanfactory beanfactory) löst beansexception {self = beanfactory.getbean (myService.class);} aus;}Dann kam alles ans Licht. In dem Fall wurde MyService beanfactoryaware ausgelöst, und eine Proxy -Klasse wurde über beanfactory.getbean (myService.class) erstellt; (Tipps: Die aktuelle Proxy -Klasse enthält nicht @Asyncs Adivisor), da der Frühling tatsächlich die MyService -Bohne erstellt und noch nicht in die Beanfaktorin gesteckt wurde. Dann haben wir beanfactory.getbean (myService.class) ausgelöst; In diesem Prozess haben wir den Proxy erstellt und zurückgegeben und sich der Karte im Voraus angeschlossen. Dies führt zu einer Reihe von Problemen, die folgten. Es fühlt sich ein bisschen verwickelt an. Sprechen Sie mit dem Bild:
Normalerweise sollte der folgende Prozess sein:
Dies ist der Fall bei einer abnormalen Situation
Zusammenfassung
Verwenden Sie unter normalen Umständen @Autowire, um injizieren zu können (wenn Autowire verwendet wird, wirft die obige Situation die kreisförmige Abhängigkeit direkt an). Wenn es ein Problem gibt, können Sie es natürlich nicht loslassen. Sie müssen den Grund und den Grund kennen!
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.