spring - the - in its raw version as part of a circular reference but has eventually been wrapped
primavera autowired aop dependencia circular (2)
Finalmente, lo @Lazy
utilizando @Lazy
on services (con métodos anotados con @Async
), y también , donde fueron autoinstalados. De esta manera, supongo que Spring solo inicializa y autowires esos servicios cuando son necesarios en lugar de en la inicialización del contexto de la aplicación.
Estoy usando java config con @ComponentScan
para inicializar mis beans y @EnableAspectJAutoProxy(proxyTargetClass=true)
para usar proxies cglib.
En este proyecto tenemos una gran cantidad de servicios generados automáticamente entre ellos usando @Autowired
. Funciona bastante bien.
Pero, para algunos de estos servicios he agregado @Async
(también he agregado @EnableAsync(proxyTargetClass = true)
en mi clase @Configuration
).
Después de eso, estoy recibiendo:
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.
Supongo que esto se debe a que Spring está inyectando el servicio con el método @Async
ANTES que AOP cree el proxy. Este podría ser el problema? ¿Cómo debo arreglarlo?
Para intentar aclarar mi problema, digamos que tengo:
@Servicio A, B y C
A se ha conectado automáticamente. B & C. Ha sido autorizada. A & C. Ha sido autorizada. A & B.
C tiene un método marcado como @Async.
Cuando Spring inicializa applicationContext, intenta inicializar A, pero necesita B & C, por lo que los inicializa. Pero después de todo, AOP intenta hacer un proxy de C (porque @Async) y luego detecta que C autowired en B y A no es lo mismo que proxy de C, por lo que falla.
Espero que esto pueda explicar un poco más lo que está pasando.
Logré solucionar un problema similar agregando @Qualifier junto con @Autowire, por ejemplo:
@Autowired
@Qualifier("publisher")
private Publisher publisher;