스프링의 @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 확장 어노테이션은 아래와 같다.
Conditional
that only matches when beans meeting all the specified requirements are already contained in the BeanFactory
.
Conditional
that only matches when the specified classes are on the classpath.
Conditional
that matches when the specified cloud platform is active.
Configuration annotation for a conditional element that depends on the value of a SpEL expression.
Conditional
that matches based on the JVM version the application is running on.
Conditional
that matches based on the availability of a JNDI InitialContext
and the ability to lookup specific locations.
Conditional
that only matches when no beans meeting the specified requirements are already contained in the BeanFactory
.
Conditional
that only matches when the specified classes are not on the classpath.
Conditional
that only matches when the application context is a not a web application context.
Conditional
that checks if the specified properties have a specific value.
Conditional
that only matches when the specified resources are on the classpath.
Conditional
that only matches when a bean of the specified class is already contained in the BeanFactory
and a single candidate can be determined.
Conditional
that matches when the application is a web application.
SpringBoot에서 제공하는 Conditional확장 어노테이션의 Matcher 구현체만 잘 찾아보아도 많은 공부가 될것같아 보인다.
(github til 에 하나씩 추가 해보는것도 나쁘지 않겠다.)