스프링 부트의 자동구성에서 사용하는 조건 @Annotaion
책을 보면서 따라하고는 있지만 신기한 경험을 하는 중이다. 개발의 방법이 이미 십몇년전과는 완전 다르기 때문이다. 어떤 것도 알지 못했던 내용들이다. 기본이 웹이라는 것만 변함이 없다.
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
public class JdbcTemplateCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
try {
context.getClassLoader().loadClass("org.springframework.jdbc.core.JdbcTemplate");
return true;
} catch (Exception e) {
return true;
}
}
}
@Conditional(JdbcTemplateCondition.class)
@Bean
public MyService myService() {
...
}
이 경우, JdbcTemplateCondition을 통과할 때만 MyService빈을 생성한다. JdbcTemplate가 클래스 패스에 있을 때만 MyService빈을 생성한다.
그렇지 않을 경우 이 빈 선언은 무시된다.
스프링 부트는 몇가지 특별한 조건 애너테이션을 정의하고, 이들을 구성 클래스에 사용하여 조건부 구성을 적용한다.
다음 표는 스프링 부트가 제공하는 조건 애너테이션이다.
조건 애너테이션 |
구성을 적용하는 조건 |
@ConditionalOnBean |
대상 빈을 구성함 |
@ConditionalOnMissingBean |
대상 빈을 아직 구성하지 않음 |
@ConditionalOnClass |
대상 클래스가 클래스패스에 있음 |
@ConditionalOnMissingClass |
대상 클래스가 클래스패스에 없음 |
@ConditionalOnExpression |
스프링 표현석 언어(SpEL)가 참(true) |
@ConditionalOnJava |
자바 버전이 특정 버전 또는 버전 범위에 맞음 |
@ConditionalOnJndi |
JNDI InitialContext가 사용 가능하고, 선택적으로 지정한 JNDI위치가 있음 |
@ConditionalOnProperty |
지정한 구성 프로퍼티가 기대하는 값을 가짐 |
@ConditionalOnResource |
지정한 리소스가 클래스 패스에 있음 |
@ConditionalOnWebApplication |
애플리케이션이 웹 애플리케이션임 |
@ConditionalOnNotWebApplication |
애플리케이션이 웹 애플리케이션이 아님 |
스프링 자동 구성 라이브러리가 제공하는 DataSourceAutoConfiguration의 일부
@Configuration
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
@EnableConfigurationProperties(DataSourceProperties.class)
@Import({ Registrar.class, DataSourcePoolMetadataProvidersConfiguration.class })
public class DataSourceAutoConfiguration {
....
}
DataSource와 EmbeddedDatabaseType 둘 다 클래스 패스에 있도록 요구하기 위해서 @ConditionalOnClass 애너테이션을 붙혔다는 것이 주목할 점. 클래스패스에 DataSource와 EmbeddedDatabaseType이 없다면 조건을 만족하지 못하므로 DataSourceAutoConfiguration이 제공하는 구성들은 모두 무시한다.
'프로그래밍 > Spring' 카테고리의 다른 글
스프링 부트 프로퍼티 설정 방법 (0) | 2019.01.10 |
---|---|
java.lang.IllegalArgumentException: There is no PasswordEncoder mapped for the id "null" 해결 (0) | 2019.01.10 |
STS(Spring Tool Suite4, Eclipse) 자동 import 설정 방법 (0) | 2019.01.09 |
스프링 부트 CLI에서 Initializr사용 (0) | 2019.01.08 |
스프링 CLI 설치 (Mac OS X, Homebrew) (0) | 2019.01.08 |