본문 바로가기
프로그래밍/Spring

스프링 부트의 자동구성에서 사용하는 조건 @Annotaion

by Mr-후 2019. 1. 9.
반응형


스프링 부트의 자동구성에서 사용하는 조건 @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이 제공하는 구성들은 모두 무시한다. 


반응형