programing

애플리케이션 컨텍스트에서 일부 콩의 의존성이 사이클을 형성합니다.

batch 2023. 3. 2. 22:07
반응형

애플리케이션 컨텍스트에서 일부 콩의 의존성이 사이클을 형성합니다.

Spring Boot v1.4.2에서 작업 중입니다.JPA를 사용한 릴리스 어플리케이션

저장소 인터페이스 및 구현 정의

ARepository

@Repository
public interface ARepository extends CrudRepository<A, String>, ARepositoryCustom, JpaSpecificationExecutor<A> {
}

ARepository 커스텀

@Repository
public interface ARepositoryCustom {
    Page<A> findA(findAForm form, Pageable pageable);
}

ARepository Impl

@Repository
public class ARepositoryImpl implements ARepositoryCustom {
    @Autowired
    private ARepository aRepository;
    @Override
    public Page<A> findA(findAForm form, Pageable pageable) {
        return aRepository.findAll(
                where(ASpecs.codeLike(form.getCode()))
                .and(ASpecs.labelLike(form.getLabel()))
                .and(ASpecs.isActive()),
                pageable);
    }
}

서비스 AServiceImpl

@Service
public class AServiceImpl implements AService {
    private ARepository aRepository;
    public AServiceImpl(ARepository aRepository) {
        super();
        this.aRepository = aRepository;
    }
    ...
}

응용 프로그램이 다음 메시지로 시작되지 않습니다.

***************************응용 프로그램 부팅 실패***************************
설명:

응용 프로그램콘텍스트 내의 일부 콩의 의존성에 따라 사이클이 형성됩니다.

| aRepository Impl└─────┘

http://docs.spring.io/spring-data/jpa/docs/current/reference/html/ #statorys.single-statory-intervisories에 기재되어 있는 모든 절차를 따랐습니다.

도와주세요!

로랑

사용하다@Lazy

이 순환을 끊는 간단한 방법은 스프링에게 콩 중 하나를 느긋하게 초기화하도록 요청하는 것입니다.즉, 콩을 완전히 초기화하지 않고 다른 콩에 삽입하는 프록시를 만듭니다.주입된 콩은 처음 필요할 때만 완전히 만들어집니다.

@Service
public class AServiceImpl implements AService {
    private final ARepository aRepository;
    public AServiceImpl(@Lazy ARepository aRepository) {
        super();
        this.aRepository = aRepository;
    }
    ...
}

출처 : https://www.baeldung.com/circular-dependencies-in-spring

@Lazy 주석을 사용하면 해결됩니다.

@Component
public class Bean1 {
    @Lazy
    @Autowired
    private Bean2 bean2;
}

원래의 문제에 대한 간단한 해결 방법이 있습니다.ARepositoryCustom 및 ARepositoryImpl에서 @Repository를 삭제하기만 하면 됩니다.모든 명명 및 인터페이스/클래스 계층을 유지합니다.다 괜찮아요.

소스코드를 테스트해 봤는데 뭔가 이상하더군요

우선, 당신의 소스코드에서 다음과 같은 에러가 발생했습니다.

There is a circular dependency between 1 beans in the application context:
- ARepositoryImpl (field private test.ARepository test.ARepositoryImpl.aRepository)
- aRepositoryImpl

그럼 봄은 또 다른 '혼돈'이 되겠네요.ARepository(JPA 저장소) 및ARepositoryImpl(커스텀 저장소).그래서 이름을 바꾸시는 것이 좋습니다. ARepository다른 무언가로, 예를 들어BRepository반 이름을 바꾸면 되더라고요.

스프링 데이터 공식 문서(https://docs.spring.io/spring-data/jpa/docs/current/reference/html/):

이러한 클래스는 네임스페이스 요소의 속성 repository-impl-postfix를 검색된 리포지토리 인터페이스 이름에 추가하는 명명 규칙을 따라야 합니다.이 포스트픽스는 디폴트로 [Inpact]으로 되어 있습니다.

이것을 pom.xml 파일에 추가합니다.난 괜찮아

spring.main.allow-circular-references:true

내 경우:나는 덧붙였다.

spring:
   main:
    allow-circular-references: true

application.yml로 이동합니다.

또는 추가할 수 있습니다.

spring.main.allow-circular-references=true

application.properties로 이동합니다.

application.yml 및 application.properties 파일은 모두 다음 디렉토리에 있습니다.

언급URL : https://stackoverflow.com/questions/41608705/the-dependencies-of-some-of-the-beans-in-the-application-context-form-a-cycle

반응형