스프링 순환 의존

7168 단어 프레임
Spring 순환 의존 이란 클래스 A 는 B 에 의존 하고 B 는 A 에 의존 하 는 것 을 말한다.이것 은 주입 에 의존 할 때 일정한 문 제 를 가 져 올 수 있다.순환 의존 상황 을 설명 한다.
존재 구조 주입
public class AServieImpl implements AService{

    private TestService testService;

    public void setTestService(TestService testService){
        this.testService=testService;
    }

    public AServieImpl(){

    }

}
public class TestServiceImpl implements TestService {

    private AService aService;

    @Override
    public void test() {
        // TODO          
        System.out.println("test serviceimpl");
    }

    public TestServiceImpl(AService aService){
        this.aService=aService;
    }
}
 class="com.test.service.impl.AServiceImpl" name="aService" id="aService" >
        <property name="testService" ref="testService">property>
              
     class="com.test.service.impl.TestServiceImpl" name="testService" id="testService" >
        name="aService" ref="aService">
     

오류 보고: org. springframework. beans. factory. AnnantLoadBeanClassException: ServletContext 리 소스 [/ WEB - INF / spring. xml] 에 정 의 된 이름 'aService' 가 있 는 bean 의 클래스 [com. test. service. impl. Service Impl] 을 찾 을 수 없습니다.
구조 주입 은 의존 대상 을 초기 화하 고 그 자 체 를 예화 하 는 것 이다.따라서 TestServiceImpl 이 실례 화 되 려 면 먼저 AService 를 초기 화한 다음 에 AService 를 찾 아가 야 한다.그러나 설정 값 주입 은 인 스 턴 스 자체 로 의존 대상 을 초기 화 합 니 다.그래서 아 서 비 스 는 그 자 체 를 예화 하 는 동시에 TestServiceImpl 에 의존 하 라 고 요구 한 다음 에 TestServiceImpl 을 찾 지 못 했다.그래서 잘못 보 고 했 어.
Spring 용 기 는 만 들 고 있 는 모든 bean 식별 자 를 '현재 bean 풀 만 들 기' 에 놓 습 니 다. bean 식별 자 는 만 드 는 과정 에서 이 풀 에 계속 유 지 됩 니 다. 따라서 bean 을 만 드 는 과정 에서 자신 이 '현재 bean 풀 만 들 기' 에 있 는 것 을 발견 하면 Bean Currently InCreation Exception 이상 을 던 져 순환 의존 을 표시 합 니 다.생 성 이 끝 난 bean 은 '현재 bean 풀 만 들 기' 에서 삭 제 됩 니 다.setter 주입 에 대한 의존 은 Spring 용 기 를 통 해 무 참 구조 함수 의 정례 화 를 완 료 했 으 나 다른 절차 (예 를 들 어 setter 주입) 를 완성 하지 못 한 bean 을 미리 노출 시 켜 완성 한 것 이 며, 단일 역할 도 메 인의 bean 순환 의존 만 해결 할 수 있 습 니 다.하나의 단일 공장 방법 을 미리 노출 시 켜 다른 bean 이 이 bean 을 참조 할 수 있 도록 합 니 다.
addSingletonFactory(beanName, new ObjectFactory() {     
    public Object getObject() throws BeansException {     
        return getEarlyBeanReference(beanName, mbd, bean);     
    }     
}); 

단일 설정 값 주입
public class AServieImpl implements AService{

    private TestService testService;

    public void setTestService(TestService testService){
        this.testService=testService;
    }

}
public class TestServiceImpl implements TestService {

    private AService aService;

    @Override
    public void test() {
        // TODO          
        System.out.println("test serviceimpl");
    }

    public void setaService(AService aService) {
        this.aService = aService;
    }


}
class="com.test.service.impl.AServieImpl" name="aService" id="aService" >
        <property name="testService" ref="testService">property>
              
     class="com.test.service.impl.TestServiceImpl" name="testService" id="testService" >
        <property name="aService" ref="aService">property>
     

단일 set 주입 이 가능 합 니 다.단일 체 가 아니면 안 돼.Spring 용 기 는 캐 시 'prototype' 역할 영역의 bean 을 하지 않 기 때문에 생 성 중인 bean 을 미리 노출 할 수 없습니다.

좋은 웹페이지 즐겨찾기