복붙노트

[SPRING] 왜 Spring은 @DependsOn 주석을 무시 했습니까?

SPRING

왜 Spring은 @DependsOn 주석을 무시 했습니까?

저는 Webapp 용으로 Spring 3.1.3을 사용하고 있습니다. 컴포넌트 스캔과 함께 XML 설정을 사용하고 있습니다.

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

의존성 순서를 설정하기 위해, 나는 다른 것들보다 먼저 사후 생성 될 필요가있는 클래스에서 '@Component'를 '@Component ( "configData")로 변경했다. 그런 다음 "configData"bean 이후에 사후 생성 될 필요가있는 각 클래스 정의 바로 앞에 '@DependsOn ( "configData")를 추가했습니다.

내가 읽은 것부터 이것이 종속성 순서를 시행하는 데 필요한 전부입니다.

나는 모든 것을 만들고, 브레이크 포인트를 설정하고, 앱을 시작했다. 나는 "configData"빈에서 중단 점에 도달하기를 기대했다. 이것은 일어난 것이 아닙니다. 첫 번째 중단 점은 종속 bean 중 하나의 "init"메소드에 있습니다.

그런 다음 "log4j.xml"을 "org.springframework"의 로깅 수준으로 설정하고 내 테스트를 다시 수행하도록 "debug"를 설정했습니다. 중단 점의 동작은 같았고, 나의 로깅은 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"의 "init ()"메소드가 "ConfigData"의 "init ()"메소드보다 먼저 Spring에 의해 호출된다는 것입니다.

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

해결법

  1. ==============================

    1.(다른 사람의 정확한 답변이지만 지금은 삭제 된 답변)

    (다른 사람의 정확한 답변이지만 지금은 삭제 된 답변)

    @DependsOn 계약은 bean이 생성되고 속성이 설정되었음을 보증합니다. 이것은 @PostConstruct 메서드가 호출 된 것을 보증하지 않습니다.

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

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

  2. ==============================

    2.나는 또한 같은 문제를 겪었으나 여전히 제대로 해결되지 못했다. 해결책의 일부로 봄 문서에서 다음과 같이 말합니다 :

    나는 또한 같은 문제를 겪었으나 여전히 제대로 해결되지 못했다. 해결책의 일부로 봄 문서에서 다음과 같이 말합니다 :

    이것이 @dependsOn 어노테이션이 아무런 효과가없는 이유입니다.

  3. from https://stackoverflow.com/questions/22178735/why-did-spring-ignore-my-dependson-annotation by cc-by-sa and MIT license