Spring Conditional annotation

Circlee7
6 min readNov 23, 2017

--

스프링의 @Conditional에 대해 알아보자.

Conditional 의 match 여부에 따라 빈이 등록되어질수 있다.
@Profile도 @Conditional을 이용하여 동작될거라고 생각된다.

Conditional 어노테이션은 Spring 4.0 부터 추가되었으며
Type 과 메소드에 작성이 가능하다.

@Conditional(ECRedisConfigRegistCondition.class)

위와 같이 Condition 인터페이스 구현체를 명시함으로써
matches 메소드를 통해 조건 체크를 할수 있다.

matches 메소드로 Context와 annotation metadata 인자를 넘기기 때문에.context.getEnvironment().getProperty(key);
와 같이 해당 context의 property를 가져올 수 있고, 값 기준으로 조건을 작성할수 있다.

Spring Boot에서는 Conditional과 비슷하고 더 다양한 어노테이션들을 제공한다.
@ConditionalOnProperty 가 존재한다.

@ConditionalOnProperty(name="server.host", havingValue="localhost")

위와 같이 사용한다.

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

내부적으로 Conditional 어노테이션이 작성되어 잇으며
OnPropertyCondition.class 를 조건으로 사용한다.
OnPropertyCondition 에서는 anotation의 metadata 로 프로퍼티 값에 따른
조건 처리를 한다.

@ConditionalOnProperty(name="server.host", havingValue="localhost")

SpringBoot에서 제공하는 Conditional 확장 어노테이션은 아래와 같다.

ConditionalOnBean

Conditional that only matches when beans meeting all the specified requirements are already contained in the BeanFactory.

ConditionalOnClass

Conditional that only matches when the specified classes are on the classpath.

ConditionalOnCloudPlatform

Conditional that matches when the specified cloud platform is active.

ConditionalOnExpression

Configuration annotation for a conditional element that depends on the value of a SpEL expression.

ConditionalOnJava

Conditional that matches based on the JVM version the application is running on.

ConditionalOnJndi

Conditional that matches based on the availability of a JNDI InitialContext and the ability to lookup specific locations.

ConditionalOnMissingBean

Conditional that only matches when no beans meeting the specified requirements are already contained in the BeanFactory.

ConditionalOnMissingClass

Conditional that only matches when the specified classes are not on the classpath.

ConditionalOnNotWebApplication

Conditional that only matches when the application context is a not a web application context.

ConditionalOnProperty

Conditional that checks if the specified properties have a specific value.

ConditionalOnResource

Conditional that only matches when the specified resources are on the classpath.

ConditionalOnSingleCandidate

Conditional that only matches when a bean of the specified class is already contained in the BeanFactory and a single candidate can be determined.

ConditionalOnWebApplication

Conditional that matches when the application is a web application.

SpringBoot에서 제공하는 Conditional확장 어노테이션의 Matcher 구현체만 잘 찾아보아도 많은 공부가 될것같아 보인다.
(github til 에 하나씩 추가 해보는것도 나쁘지 않겠다.)

--

--