프로그래밍 노트/SPRING BOOT

@Conditional, @ConditionalOnXXX

깡냉쓰 2019. 11. 18. 21:32
728x90
반응형

@Conditional

spring4 부터 사용가능하며, Java configuration에서 조건적으로 Spring Bean을 등록할 수 있다.

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface Conditional {

    /**
     * All {@link Condition}s that must {@linkplain Condition#matches match}
     * in order for the component to be registered.
     */
    Class? extends Condition[] value();

}

// Condtion.class
public interface Condition {
  boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);
}

SpringBoot는 @Conditional을 확장하여, 여러가지 어노테이션을 제공한다.

  • @ConditionalOnWebApplication : 프로젝트가 웹 애플리케이션이면 Bean 등록
  • @ConditionalOnBean: 해당 Bean이 존재하면 자동 설정 등록
  • @ConditionalOnMissingBean: 해당 Bean이 존재하지 않으면 자동설정 등록
  • @ConditionalOnClass: 해당 클래스가 존재하면 자동설정 등록
  • @ConditionalOnMissingClass: 해당 클래스가 클래스 패스에 존재하지 않으면 Bean 등록
  • @ConditionalOnResource: 해당 자원(file 등)이 존재하면 자동설정 등록
  • @ConditionalOnProperty: 설정한 프로퍼티가 존재하면 자동설정 등록

ex)

@Configuration
@ConditionalOnClass(XmlMapper.class) // XmlMapper.class가 있으면 자동 등록
@ConditionalOnBean(Jackson2ObjectMapperBuilder.class) // Jackson2ObjectMapperBuilder가 있으면 자동등록
protected static class MappingJackson2XmlHttpMessageConverterConfiguration {

    @Bean
    @ConditionalOnMissingBean // 해당빈 MappingJackson2XmlHttpMessageConverter 이 존재하지 않으면 빈등록
    public MappingJackson2XmlHttpMessageConverter mappingJackson2XmlHttpMessageConverter(
            Jackson2ObjectMapperBuilder builder) {
        return new MappingJackson2XmlHttpMessageConverter(builder.createXmlMapper(true).build());
    }

}
728x90
반응형