Spring 3.1.0 실현 원리 분석 (5). 순환 인용 에 대한 연구

순환 인용 이란 대상 간 의 상호 의존 이 하나의 폐쇄 적 인 고 리 를 형성 하 는 것 을 말한다. 예 를 들 어 A 는 B 에 의존 하고 B 는 C 에 의존 하 며 C 는 반대로 A 에 의존 하 는데 이것 은 순환 인용 에 대한 기본 적 인 인식 이다.그리고 Spring 에서 순환 적 으로 인용 하면 세 가지 장면 으로 나 눌 수 있 으 니 하나씩 분석 해 보 자.
하나 단일 bean 구조 함수 기반 순환 참조
       1). bean 정의 

           
                 
            
           
                
           
           
               
           

      위 에서 모두 세 개의 대상 을 정의 하고 각각 자신의 구조 함수 에서 다른 대상 을 인용한다.
       2). 실행 결과
            실행 에 실패 하면 Spring 은 이상 을 던 집 니 다.
       3) 원인 분석
            Spring 이 하나의 대상 을 만 드 는 것 은 크게 네 가지 절차 로 나 눌 수 있 는데 그것 이 바로 '실례 화', '속성 값 채 우기', '초기 화', '등록 사후 처리', '등록 사례 Bean' (상기 절 차 는 AOP 의 상황 을 잠시 고려 하지 않 음) 이다. 이 몇 가지 절차 의 후속 블 로 그 는 상세 하 게 분석 할 것 이 고 여 기 는 전개 되 지 않 을 것 이다.위의 설정 에 따라 Spring 은 먼저 A 대상 을 만 들 려 고 시도 합 니 다. 기본 구조 함수 가 아 닌 것 으로 호출 되 기 때문에 예화 하기 전에 실제 인삼 대상 (즉 B 대상) 을 가 져 와 야 합 니 다. Spring 은 예화 되 고 있 는 A 대상 의 ID 를 Default Singleton Bean Registry 류 의 Set singletons Currently InCreation 집합 에 넣 고 B 대상 을 만 듭 니 다.
            B 대상 을 예화 하 는 과정 에서 기본 구조 함수 가 아 닌 것 으로 호출 되 기 때문에 Spring 은 예화 중인 B 대상 의 ID 를 캐 시 에 넣 고 C 대상 을 만 들 려 고 시도 합 니 다.C 대상 을 예화 하 는 절 차 는 위 와 같 습 니 다. Spring 은 예화 C 대상 이 A 대상 을 먼저 만들어 야 한 다 는 것 을 발 견 했 습 니 다. 먼저 C 대상 의 ID 를 캐 시 에 넣 습 니 다.현재 캐 시 에는 A, B, C 세 개체 의 ID 가 있 습 니 다.
            그리고 Spring 은 다시 A 대상 을 만 들 려 고 시 도 했 습 니 다. B 대상 에 의존 하 는 것 을 발 견 했 습 니 다. Spring 이 A 대상 의 ID 를 다시 캐 시 에 넣 었 을 때 캐 시 에 A 대상 의 ID 가 존재 하 는 것 을 발 견 했 습 니 다. 그래서 Spring 은 이것 이 순환 이 라 고 생각 하고 이상 을 던 졌 습 니 다.           
둘. 단일 bean setter 기반 순환 참조
      1). bean 정의
 
       
            
       
       
            
       
       
            
        

 
    2). 실행 결과
           실행 성공
      3) 원인 분석
           Spring 은 먼저 A 대상 을 예화 합 니 다. 기본 구조 함수 로 호출 되 었 기 때문에 이 단계 에서 다른 대상 에 대한 의존 이 존재 하지 않 기 때문에 A 대상 을 예화 하 는 데 성공 한 다음 에 Spring 은 Object Factory 인터페이스의 실현 류 를 만 들 고 Default Singleton Bean Registry 류 의 Map singleton Factory 에 넣 었 습 니 다.
           A 대상 을 예화 하 는 데 성공 한 후 대상 을 만 드 는 두 번 째 단계 에 들 어 갑 니 다. '속성 값 채 우기' 입 니 다. 이때 Spring 은 B 대상 을 먼저 만들어 야 한 다 는 것 을 발 견 했 습 니 다. 과정 은 A 대상 을 만 드 는 것 과 마찬가지 로 예화 B 대상 은 성공 적 이 었 습 니 다. B 대상 의 속성 값 을 채 울 때 C 대상 에 의존 하 는 것 을 발 견 했 습 니 다. 그리고 C 대상 을 만 들 었 습 니 다. 예화 C 대상 이 성공 한 후에 C 대상 의 속성 을 채 우기 시 작 했C 대상 이 A 대상 에 의존 하 는 것 을 발 견 했 습 니 다. 이때 Spring 은 A 대상 의 ID 에 따라 singletonFactory 에서 ObjectFactory 인터페이스 실현 류 를 가 져 와 getObject () 방법 으로 A 대상 을 가 져 온 다음 에 A 대상 을 C 대상 에 게 부여 하 는 속성 을 가 져 왔 습 니 다. C 대상 은 생 성 과정 을 마 친 다음 에 C 대상 을 B 대상 에 게 부여 하 는 속성 을 가 져 왔 습 니 다. B 대상 은 생 성 과정 을 완 료 했 습 니 다.그리고 B 대상 이 A 대상 에 게 부여 한 속성 은 A 대상 도 성공 적 으로 만 들 었 습 니 다.
            추가 설명 에 따 르 면 Object Factory \ # getObject () 를 호출 하여 A 대상 을 가 져 올 때 민감 한 bean 백 프로세서 (Smart Instantiation AwareBeanPostProcessor) 가 존재 하면 프로세서 의 getEarly BeanReference (Object bean, String beanName) 를 호출 합 니 다. 이 패션 은 반제품 A 대상 이 실행 한 후 처리 합 니 다.
3. 속성 bean 은 setter 기반 순환 참조
       1). bean 정의
 
       
             
       
       
            
       
       
            
        

      2). 실행 결과
            실행 에 실패 하면 Spring 은 이상 을 던 집 니 다.
      3) 원인 분석
            A 대상 이 실례 화 에 성공 한 후, 단일 빈 이 아니 기 때문에 캐 시 되 지 않 아 순환 이 되 지 않 습 니 다.

좋은 웹페이지 즐겨찾기