복붙노트

[SPRING] Spring @Conditional 구성 주석의 평가를 지연시키는 방법은 무엇입니까?

SPRING

Spring @Conditional 구성 주석의 평가를 지연시키는 방법은 무엇입니까?

환경에 특정 속성 값이 설정되면 Bean을 등록해야하는 Spring @Configuration 클래스가 있습니다. 값이 존재하는지 검사하는 커스텀 Condition 구현을 작성했는데, JUnit 테스트를 실행할 때 빈이 등록되지 않았지만 스프링 부트에서 애플리케이션을 시작할 때 작동한다. 응용 프로그램을 디버깅하고 PropertySourcesPlaceholderConfigurer가 인스턴스화되기 전에 Condition이 평가되고 있는지를 확인했습니다.

ConfigurationCondition을 구현하고 REGISTER_BEAN 단계에서 평가를 지정하기 위해 조건을 수정했습니다. 이 메소드는 구성자를 인스턴스화하기 전에 여전히 호출되지만 등록 된 bean은 이제 특성 파일에서 특성을 추가하거나 제거 할 때마다오고갑니다.

평가를 재정렬하는 가장 좋은 방법입니까? 이게 ConfigurationCondition 인터페이스가 필요한 것입니까, 아니면 지금 실수로 작동하도록 설정되어 있습니까?

@Conditional(PropertyCondition.class)
@Configuration
public class PostbackUrlConfiguration {
    @Value("${serviceName.postbackUrl}")
    String postbackUrl;

    @Bean
    public PostbackUrlProvider provider() {
        return new FixedUrlProvider(postbackUrl);
    }
}

 

public class PropertyCondition implements ConfigurationCondition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return context.getEnvironment().containsProperty("serviceName.postbackUrl");
    }

    @Override
    public ConfigurationPhase getConfigurationPhase() {
        return ConfigurationPhase.REGISTER_BEAN;
    }
}

테스트 구성은 테스트 케이스의 정적 클래스입니다.

@Configuration
@ComponentScan
@PropertySource("classpath:/postback.properties")
@Import(PostbackUrlConfiguration.class)
public static class TestConfig {
    @Bean
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }
}

해결법

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

    1.@Configuration 클래스의 구문 분석 단계는 클래스 정의를 읽는 것, Configuration 객체의 컬렉션을 채우는 것 (하나의 @Configuration 클래스가 다른 @Configuration 클래스를 가져 와서 이러한 가져 오기도 구문 분석 할 수 있기 때문에), @PropertySources, @ImportResources 등을 처리하는 것과 관련됩니다.

    @Configuration 클래스의 구문 분석 단계는 클래스 정의를 읽는 것, Configuration 객체의 컬렉션을 채우는 것 (하나의 @Configuration 클래스가 다른 @Configuration 클래스를 가져 와서 이러한 가져 오기도 구문 분석 할 수 있기 때문에), @PropertySources, @ImportResources 등을 처리하는 것과 관련됩니다.

    @PropertySources를 처리하더라도 아직 해당 등록 정보가로드되지 않습니다. 파싱 ​​단계가 완료되면 @PropertySources 속성이로드됩니다. 이들이로드 된 후 @Configuration 클래스 내부의 빈 정의가 등록됩니다 (REGISTER_BEAN 단계).

    그래서, 당신은 ConfigurationPhase.REGISTER_BEAN 단계와 함께 ConfigurationCondition을 사용하는 것이 기대됩니다. 그 이유는 빈의 정의가 등록되고 @Configuration 클래스가 파싱 된 후에 환경에서 실제로 사용 가능하기 때문입니다. @Configuration 클래스의 파싱 단계까지 도달하지 못한다고 판단한 조건 만 사용하면 @Configuration 클래스 정의가 등록되기 전에도 평가가 수행됩니다.

  2. from https://stackoverflow.com/questions/23526643/how-do-i-delay-evaluation-of-a-spring-conditional-configuration-annotation by cc-by-sa and MIT license