스프링 - 순환 종속성

1967 단어 springprogrammingjava
순환 종속성은 두 개 이상의 Bean이 생성자를 통해 서로 주입을 시도하는 시나리오입니다.

콩 A → 콩 B → 콩 C → 콩 D → 콩 E → 콩 A

또는 더 간단한 방법으로

콩 A → 콩 B → 콩 A

모든 것이 👌면 어떨까요?



대신 다음과 같은 것이 있습니다.

콩 A → 콩 B → 콩 C

Spring은 bean C를 생성하고, bean B를 생성하고(그리고 bean C를 거기에 주입한다), 그리고 나서 bean A를 생성한다(그리고 bean B를 주입한다).

그러나 순환 종속성을 사용하면 Spring은 상호 종속적이기 때문에 어떤 Bean을 먼저 생성해야 하는지 결정할 수 없습니다. Spring은 이러한 상황에서 컨텍스트를 로드하는 동안 BeanCurrentlyInCreationException을 발생시킵니다.

When implementing constructor injection in Spring, this can happen. We shouldn't have this problem if we utilize other sorts of injections because dependencies will be injected only when they're needed, not when the context is loaded. ❗



그것을 고칠 방법이 있습니까? 🤔



  • 재설계(웃음)

  • @Lazy 사용
    Bean 중 하나를 지연 초기화하도록 Spring에 지시하는 것은 주기를 중지하는 간단한 방법입니다. 결과적으로 bean을 완전히 초기화하는 대신 다른 bean에 주입될 프록시를 생성합니다. 주입된 빈이 처음 필요할 때 완전히 생성됩니다.

  • @Component
    public class CircularDependencyA {
    
        private CircularDependencyB circB;
    
        @Autowired
        public CircularDependencyA(@Lazy CircularDependencyB circB) {
            this.circB = circB;
        }
    }
    



  • 세터/필드 주입 사용
    Spring은 bean을 생성하지만 종속성은 이러한 방식으로 필요할 때까지 주입되지 않습니다.
  • 좋은 웹페이지 즐겨찾기