2014-03-04 4 views
11

저는 구성 요소 검색과 함께 XML 구성을 사용하여 Webapp에 Spring 3.1.3을 사용하고 있습니다.Spring에서 @DependsOn 주석을 무시한 이유는 무엇입니까?

스캔 한 구성 요소 중 하나를 여러 다른 구성 요소보다 먼저 초기화해야한다는 것을 알았습니다. post-construct 초기화가 필요한 모든 클래스에서 메소드에 @PostConstruct 주석이 있습니다.

종속성 순서를 설정하려면 다른 구성 요소보다 사후 구축해야하는 클래스에서 '@Component'를 '@Component ("configData")로 변경했습니다. 그런 다음 "configData"bean 이후에 사후 생성 될 필요가있는 각 클래스 정의 바로 앞에 '@DependsOn ("configData")를 추가했습니다.

내가 읽은 것으로부터 이것은 의존성 순서를 시행하는 데 필요한 모든 것입니다.

그런 다음 모든 것을 구현하고 중단 점을 설정 한 다음 앱을 시작했습니다. 나는 "configData"빈에서 중단 점에 도달하기를 기대했다. 이것은 일어난 것이 아닙니다. 첫 번째 중단 점은 종속 bean 중 하나의 "init"메소드에있었습니다.

"log4j.xml"을 "org.springframework"의 로깅 수준으로 설정하고 내 테스트를 다시 수행하도록 "debug4"를 변경했습니다. 브레이크 포인트 동작은 동일했고, 나의 로깅은 Spring 초기화에 대한 디버그 정보를 보여주지 못했다. (나는 log4j 초기화 자체에 대해 디버깅을했기 때문에 "org.springframework"에 대해 DEBUG를 설정했다.)

무엇이 누락 되었습니까?

업데이트 :이 중요한 경우

, 여기에 내가 여기서 뭘하는지의 골격 몇 가지 예이다.

@Component("configData") 
public class ConfigData { 
    .... 
    @PostConstruct 
    public void init() { 
     .... 
    } 
} 

@Component 
@DependsOn("configData") 
public class ClassDependentOnConfigData extends BaseClass { 
    .... 
    @Override 
    @PostConstruct 
    public void init() { 
     super.init(); 
     .... 
    } 
} 

은 내가 런타임에 발견하고있어 "ClassDependentOnConfigData"의 방법 "() 초기화"가 "를 configdata"에서 "() 초기화"방법 전에 Spring에 의해 호출되는 것입니다, 반복합니다.

"BaseClass"에는 "ConfigData"에 대해 "@Autowired"가 있습니다.

+0

당신은 bean 정의를 configdata 빈의 (Java 및/또는 XML), 그리고 이후에 초기화되어야 빈을 게시 할 수 있습니다 예를 들어? –

+0

좋아,하지만 이것들은 해골 일 뿐이며 내 설명에서 알 수있는 것은 분명합니다. –

+0

스프링 디버그 메시지가 보이지 않는 경우 글로벌 THRESHOLD 세트가 없는지 확인 했습니까? 다른 말로하면 - 다른 DEBUG 메시지를 보시겠습니까? –

답변

5

(다른 사람의에서 올바른하지만 지금은 삭제 된 대답은)

@DependsOn 계약은 빈 구축되었으며 속성이 설정되어 있음을 보장합니다. 이것은 @PostConstruct 메서드가 호출 된 것을 보증하지는 않습니다.

"dependee"클래스 (다른 클래스가 의존하는 클래스)가 "afterPropertiesSet()"메소드를 구현해야하는 "InitializingBean"클래스를 구현하는 방법입니다. 내 "init()"메서드의 원래 본문을이 메서드에 넣습니다. 나는 이것이 이것에 의존하는 어떤 클래스보다 먼저 실행된다는 것을 확인했다.

원래 답변에서 언급 한 또 다른 사항은 XML에서 "dependee"bean을 정의하고 "init-method"속성을 사용하면이 것에 의존하는 클래스보다 먼저 실행해야한다는 것입니다. 나는 이것을 검증하지 않았다.

+0

답변을 다시 추가해 주셔서 감사합니다.이 솔루션을 2 일간 찾고있었습니다. –

4

나는 또한 동일한 문제를 일으켰지 만 여전히 제대로 해결되지 않았습니다. 솔루션 봄 문서의 일부가 말하기를 : 컴포넌트 스캐닝을 사용하지 않는

는 "클래스 수준의 DependsOn을 사용하면 효과가 없습니다."

이것은 @dependsOn 주석이 효과가 없습니다 이유입니다.

관련 문제