Я использую конфигурацию java с @ComponentScan
, чтобы инициализировать мои компоненты и @EnableAspectJAutoProxy(proxyTargetClass=true)
для использования прокси cglib.spring autowired aop circle dependency
В этом проекте у нас есть много сгенерированных сервисов, проложенных между ними с использованием @Autowired
. Это работает очень хорошо.
Но для некоторых из этих услуг я добавил @Async
(я также добавил @EnableAsync(proxyTargetClass = true)
на мой класс @Configuration
).
После этого, я получаю:
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.
Я думаю, это потому, что весна инъекционная службы с @Async
методом ДО АОП создает прокси-сервер. Это может быть проблема? Как я должен это исправить?
Для того, чтобы попытаться прояснить мою проблему, скажем, у меня есть:
@Service A, B & C
А имеет autowired B & C B имеет autowired A & C C имеет autowired A & B
C имеет метод, обозначенный как @Async.
Когда Spring инициализирует applicationContext, он пытается инициализировать A, но ему нужен B & C, поэтому он инициализирует их. Но, в конце концов, AOP пытается сделать прокси-сервер C (потому что @Async), а затем обнаруживает, что автоуровень C в B и A не совпадает с прокси-сервером C, поэтому он терпит неудачу.
Надеюсь, это может объяснить немного больше того, что происходит.
Пожалуйста, пост [SSCCE] (http://sscce.org/) –