@Conditional(element 등록)

Configuration 후보 중 빈 오브젝트로 등록이 되어 구성이 적용되게하거나 적용되지 않도록 선택하게하는 방법

@Conditional과 Condition

참고) 코드가 보이기 쉽게 중첩 static class를 작성

빈으로 등록할지, 등록하지 않을지를 matches 메서드의 반환 값을 통해서 결정할 수 있음

@MyAutoConfiguration
@Conditional(JettyWebServerConfig.JettyCondition.class)
public class JettyWebServerConfig {
    @Bean("jettyWebServerFactory")
    public ServletWebServerFactory servletWebServerFactory() {
        return new JettyServletWebServerFactory();
    }

    static class JettyCondition implements Condition {
        @Override
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
            return true; // Jetty 서버를 사용할 것 이므로
        }
    }
}
@MyAutoConfiguration
@Conditional(TomcatWebServerConfig.TomcatCondition.class)
public class TomcatWebServerConfig {
    @Bean("tomcatWebServerFactory")
    public ServletWebServerFactory servletWebServerFactory() {
        return new TomcatServletWebServerFactory();
    }

    static class TomcatCondition implements Condition {
        @Override
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
            return false;
        }
    }
}

@Conditional과 Condition 구조

image.png

@Conditional은 @Configuration 클래스와 @Bean 메서드에 적용이 가능

@Configuration 클래스에 적용하는 경우 ( 클래스 레벨 )

@Bean 메서드에 적용하는 경우 ( 메서드 레벨 )

@Configuration 클래스와 @Bean 메서드에 적용하는 경우

@Bean 메서드에 아무것도 적용하지 않는 경우