printemps autocâblés aop dépendance circulaire
Je suis en utilisant java config avec @ComponentScan
pour initialiser mes haricots
et @EnableAspectJAutoProxy(proxyTargetClass=true)
à utiliser cglib procurations.
Dans ce projet, nous avons un grand nombre de services générés par autocâblés entre eux à l'aide de @Autowired
. Il fonctionne assez bien.
Mais, pour certains de ces services, j'ai ajouté @Async
(j'ai aussi ajouté @EnableAsync(proxyTargetClass = true)
sur mon @Configuration
classe).
Après, je reçois:
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.
Je suppose que c'est parce que le Printemps est de l'injection de service avec @Async
méthode AVANT de l'AOP crée le proxy.
Ce pourrait être le problème?
Comment devrais-je résoudre ce problème?
Afin d'essayer de clarifier mon problème, disons que j'ai:
@Service A,B & C
Un a autocâblés B & C
B a autocâblés A & C
C a autocâblés A & B
C est une méthode marquée comme @Async.
Quand le Printemps initialiser applicationContext, il tente d'initialiser Un, mais a besoin de B & C, de sorte qu'il initialise. Mais après tout, AOP essaie de faire un proxy de C (car @Asynchrone) et puis il détecte que autocâblés C en B et A n'est pas la même que la procuration de C de manière à ce qu'il échoue.
J'espère que cela peut expliquer un peu plus ce qui se passe.
- Merci de poster un SSCCE
Vous devez vous connecter pour publier un commentaire.
AsyncConfigurer les classes de configuration de l'initialisation des premiers dans le contexte de l'application du bootstrap. Si vous avez besoin de toute dépendance à d'autres haricots là, assurez-vous de les déclarer 'lazy' aussi loin que possible dans l'ordre de les laisser passer par d'autres post-processeurs.
Référence JavaDoc: https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/scheduling/annotation/EnableAsync.html
Enfin j'ai trié à l'aide de
@Lazy
sur les services (avec les méthodes annotées avec@Async
), et aussi, où ils ont été autocâblés.De cette façon, je suppose Printemps seulement d'initialisation et de autowires ces services lorsqu'ils sont nécessaires, plutôt que sur le contexte de l'application de l'initialisation.
J'ai réussi à résoudre un problème similaire en ajoutant @Qualifier avec @Autowire, par exemple: