programing

스프링 자동 배선 aop 원형 종속성

starjava 2023. 7. 26. 21:31
반응형

스프링 자동 배선 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은 애플리케이션 컨텍스트 초기화 대신 필요한 경우에만 서비스를 초기화하고 자동화합니다.

저도 같은 문제가 있어서 이 문제를 해결했습니다.

  1. 다음 중 어느 것인지 확인했습니다.@Autowired속성이 순환 종속성의 이유입니다.

    예:

    @Autowired
    private TestService testService;
    

    (확인된 항목에 대한 팁은 의견을 제시하고 애플리케이션을 중단하는 이유가 되는 속성을 확인해 보십시오.)

  2. 식별된 후에는 그냥 사용@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

반응형