스프링 자동 배선 aop 원형 종속성
Java 구성을 사용하고 있습니다.@ComponentScan
내 콩을 초기화하기 위해 그리고.@EnableAspectJAutoProxy(proxyTargetClass=true)
cglib 프록시를 사용합니다.
이 프로젝트에서 우리는 많은 생성된 서비스를 사용하여 그들 사이에 자동으로 연결합니다.@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
프록시를 생성하기 전의 메서드입니다.이게 문제일까요?어떻게 고쳐야 하나요?
제 문제를 명확히 하기 위해 다음과 같은 것들이 있다고 가정해 보겠습니다.
@서비스 A, B 및 C;
A는 자동 배선 B & C, B는 자동 배선 A & C, C는 자동 배선 A & B;
C에는 @Async로 표시된 방법이 있습니다.
Spring이 applicationContext를 초기화할 때 A를 초기화하려고 하지만 B&C가 필요하므로 초기화합니다.그러나 결국, AOP는 C의 프록시를 만들려고 시도하고(@Async 때문에), B로 자동 배선된 C와 A가 C의 프록시와 같지 않다는 것을 감지하여 실패합니다.
저는 이것이 무슨 일이 일어나고 있는지 조금 더 설명할 수 있기를 바랍니다.
마지막으로 다음을 사용하여 정리했습니다.@Lazy
서비스(메소드에 주석 달기)@Async
) 및 자동 배선된 위치.이러한 방식으로 Spring은 애플리케이션 컨텍스트 초기화 대신 필요한 경우에만 서비스를 초기화하고 자동화합니다.
저도 같은 문제가 있어서 이 문제를 해결했습니다.
다음 중 어느 것인지 확인했습니다.
@Autowired
속성이 순환 종속성의 이유입니다.예:
@Autowired private TestService testService;
(확인된 항목에 대한 팁은 의견을 제시하고 애플리케이션을 중단하는 이유가 되는 속성을 확인해 보십시오.)
식별된 후에는 그냥 사용
@Lazy
게다가@Autowired
변수.예:
@Lazy @Autowired private TestService testService;
애플리케이션이 원활하게 작동했습니다.
AsyncConfigurer 구성 클래스는 애플리케이션 컨텍스트 부트스트랩의 초기에 초기화됩니다.만약 당신이 그곳의 다른 콩에 대한 의존성이 필요하다면, 그것들을 반드시 신고하세요.@Lazy
가능한 한 다른 포스트 프로세서를 통과할 수 있도록 합니다.
참조 JavaDoc: https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/scheduling/annotation/EnableAsync.html
언급URL : https://stackoverflow.com/questions/28985144/spring-autowired-aop-circular-dependency
'programing' 카테고리의 다른 글
lazy-init에 대한 스프링 기본 동작 (0) | 2023.07.26 |
---|---|
서비스 계층 및 컨트롤러: 무엇을 담당합니까? (0) | 2023.07.26 |
봄에 내 인증 필터 내에서 서비스를 자동 배선할 수 없음 (0) | 2023.07.26 |
Angular 2의 요소에 RouterLink 또는 다른 속성 지시어를 조건부로 추가합니다. (0) | 2023.07.26 |
Swagger가 Spring Boot을 사용하여 Spring Data Rest API를 감지하지 못함 (0) | 2023.07.21 |