문제

시작할 때와 장난 봄의 자동차-프록시,당신은 종종 이러한 행동으로 문서화:

를 구현하는 클래스 BeanPostProcessor 인터페이스 특별하고,그래서 그들은 처리 다르에 의해 컨테이너입니다.모든 BeanPostProcessors 및 그들의 직접 참조 콩 것 인스턴스화 에서 시작,일부분으로 특수 시작 단계 ApplicationContext,다음은 모든 사람들 BeanPostProcessors 등록 에 정렬 패션에 적용 모든 콩입니다.이후 AOP 자동 프록시를 구현로 BeanPostProcessor 자체 없이 BeanPostProcessors 또는 직접 참조에 대한 자격이 있 콩 자동 프록시(고,따라서이 없 측면'길쌈된'합니다.

이러한 모든 콩 표시되어야 합니다 로그 정보 메시지:"콩'foo'지 자격을 받고 처리하여 모든 BeanPostProcessors(예를 들어:지 자동으로-프록시)".

다른 말로 하면,내가 쓰는 내 자신의 BeanPostProcessor,그리고 클래스를 직접 참조 다른 콩 컨텍스트에서,그 참조된 콩을 받을 수 없 auto-프록시,그리고 메시지를 기록하는 효과가 있다.

내 문제는 아래로 추적하는 곳에는 직접적인 참조은 매우 어려울 수 있기 때문에,"직접적인 참조를"사실 수의 체인 전이 종속성을 그대로 반 콩 응용 프로그램에서 문맥.모든 봄 당신이하는 하나의 정보 메시지,그리고 그것이 정말로 많은 도움을 넘어,말하고 있을 때 콩을 잡은 이 웹에서의 참조가 있습니다.

이 BeanPostProcessor 내가 개발하는 직접적인 참조를 다른 콩이지만,그것은 매우 제한을 설정의 참조가 있습니다.그럼에도 불구하고,거의 모든 콩 저의 상황에서는 그때에서 제외되는 자동차-프록시에 따라,로그 메시지,하지만 나는 볼 수 없는 종속성입니다.

는 사람을 발견하는 더 나은 방법을 추적 이니까?

도움이 되었습니까?

해결책 2

그냥을 가지고 일하는 이 질문의 붕괴로 초기화되지 않은 객체로 그래프에 의해 발생 BeanPostProcessor@Autowired 을 얻기 위해 의존성이며,autowire 메커니즘을 효과적으로 발생하는 다른 모든 콩의 정의를 초기화 전에 나 BeanPostProcessor 수있는 기회를 얻었는 말에서 문제입니다.이 솔루션은 사용하지 않는 autowiring 에 대한 귀하의 BPPs.

다른 팁

이 레시피는:

  1. 오픈 BeanPostProcessorChecker 에서 당신의 IDE(의 내부 클래스 AbstractApplicationContext)
  2. 설정에 중단점 if (logger.isInfoEnabled()) { 에서 방법 postProcessAfterInitialization
  3. 실행 코드
  4. 을 쳤을 때 당신은 중단점을 찾기 위해 통화 getBean(String,Class<T>) 에서 당신의 스택을 추적합니다.

    중 하나 이러한 호출을 시도를 만들 BeanPostProcessor.는 콩해야의 원인이다.

배경

이 상황을 상상해보십시오:

public class FooPP implements BeanPostProcessor {
    @Autowire
    private Config config;
}

면 봄을 만들기 config (이후 그것의 종속성의 FooPP리),문제는:는 계약을 말한 모든 것 BeanPostProcessor 적용해야 합니다 모든 콩고 있는 만들어집니다.그러나 때 봄구 config, 가,적어도 하나의 PP(즉 FooPP)지 않는 서비스를 제공할 준비가!

이 나빠를 사용하는 경우 @Configuration 클래스를 정의하이 콩:

@Configuration
public class BadSpringConfig {
     @Lazy @Bean public Config config() { return new Config(); }
     @Lazy @Bean public FooPP fooPP() { return new FooPP(); }
}

모든 구성은 콩.는 수단을 구축하는 빈에서 공장 BadSpringConfig, 봄 필요를 적용하는 포스트-프로세서 fooPP 그러나 그렇게하기 위해서는,먼저 요구에 콩주셔서 감사합니다.

이 예제에서,그것이 가능한 휴식 중 하나의 순환에 의존한다는 것을 설명합니다.할 수 있습 확인 FooPP 구현 BeanFactoryAware 을 얻을 봄을 주입 BeanFactory 으로 포스팅 프로세서입니다.그런 식으로,당신은 필요하지 않 autowiring.

나중에 코드,지연에 대한 요청 콩:

private LazyInit<Config> helper = new LazyInit<Config>() {

    @Override
    protected InjectionHelper computeValue() {
        return beanFactory.getBean( Config.class );
    }
};

@Override
public Object postProcessBeforeInitialization( Object bean, String beanName ) throws BeansException {
     String value = helper.get().getConfig(...);
}

(원 LazyInit)

악순환의 고리를 끊 사 콩 공장과 포스트 프로세서,당신은 당신을 구성할 필요 포스트 프로세서에서는 XML config 파일에 있습니다.봄을 읽을 수 있는 모든 건축 구조물 받지 않고 혼동된다.

가 확실하지 않다면 그것은 어떤 도움이지만,이클립스 봄 IDEko 그래프 보기 그것처럼 보인에 도움이 될 수 밖으로 정렬 콩 references..

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top