Frühjahr autowired aop zirkuläre Abhängigkeit
Ich bin mit java-config mit @ComponentScan
um zu initialisieren, meine Bohnen
und @EnableAspectJAutoProxy(proxyTargetClass=true)
zu verwenden cglib-proxies.
In diesem Projekt haben wir eine Menge von generierten Dienste autowired, zwischen denen Sie mit @Autowired
. Es funktioniert ziemlich gut.
Aber, für einige dieser Dienste, die ich Hinzugefügt habe @Async
(außerdem habe ich @EnableAsync(proxyTargetClass = true)
auf meine @Configuration
Klasse).
Danach bin ich immer:
Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'ConversationUserLocalService': Bean with name 'ConversationUserLocalService' has been injected into other beans [ConversationUserHistoryLocalService] i
n its raw version as part of a circular reference, but has eventually been wrapped. This means that said other beans do not use the final version of the bean. This is often the result of over-eager type matching - consider using 'getBeanNamesOfType' with the 'a
llowEagerInit' flag turned off, for example.
Ich denke, dies ist so, weil Frühling ist, die Injektion der service mit @Async
Methode VOR AOP erstellt der proxy.
Dies könnte das problem sein?
Wie soll ich es beheben?
Um zu versuchen zu klären, mein problem, lassen Sie uns sagen, ich habe:
@Service A,B & C
Einen hat autowired B & C
B hat autowired A & C
C hat autowired A & B
C hat eine Methode gekennzeichnet ist, wie @Async.
Wenn der Frühling Datei ApplicationContext initialisieren, es versucht zu initialisieren, muss aber B & C, so initialisiert Sie. Aber nach allem, AOP versucht, eine proxy von C (da @Async), und er dann erkennt, dass autowired C in B und A ist nicht das gleiche wie proxy von C, so schlägt es fehl.
Ich hoffe das kann ein wenig mehr erklären, was passiert ist.
InformationsquelleAutor ilopezluna | 2015-03-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Endlich habe ich es aussortiert mit
@Lazy
auf die Leistungen (Methoden, annotiert mit@Async
), und auch, wo Sie waren autowired.Auf diese Weise denke ich Spring nur initialisieren und autowires jene Dienste, wenn Sie verpflichtet sind, statt auf dem application-Kontext-Initialisierung.
Wenn der Frühling schafft ein proxy hinzufügen asynchrone Verhalten in C spielt es keine updates Verweise auf A und B, So dass beide von Ihnen hat einen Verweis auf die raw-version von C.
danke für die Erklärung. nur noch eine Sache, das hängt von der Reihenfolge, in welcher die Feder initialisiert die Dienstleistungen. In deinem Beispiel, wenn der Frühling initialisiert zunächst C ist dann auch die gleiche exception auftreten?
InformationsquelleAutor ilopezluna
Konnte ich fix ein ähnliches Problem durch das hinzufügen von @Qualifier zusammen mit @Autowire, zum Beispiel:
InformationsquelleAutor Joel Mata