IT/JAVA

[Spring Boot] @Conditional 어노테이션

미녀개발자 2018. 7. 2. 16:28
반응형

@Conditional Annotations


Spring Boot의 뛰어난 기능 중 하나는 의심의 여지없이  auto-configuration (자동 구성) 기능입니다. 그러나 자동 구성은 다른 훌륭한 Spring 기능인 조건부 주석에 따라 구현됩니다.


@Conditional Annotations


Spring 3.1은 환경 추상화를 지원했다. 함께 @Profile주석 이 나옵니다. 우리는 마지막 블로그 게시물 중 하나에서 그것에 대해 이야기했습니다 .


그러나 Spring 4.0 @Profile은 @Conditional주석과 Condition인터페이스를 기반으로 하는 새로운 메커니즘을 도입했습니다 .


조건부 는 주석 된 컴포넌트 / bean / factory 메소드가 DI 컨테이너에 등록 할 수 있는지를 결정하는 룰을 정의하기 위해 컴포넌트에서 (메타) 주석으로 사용될 수 있습니다. 규칙 부분은 Condition 인터페이스 를 구현하여 수행됩니다 .


우리가 @Profile다시 한번 살펴볼 때 , 그것이 @Conditional주석 이 될 수 있다는 것을 알 수 있습니다 (보통 보존 주석 등을 옆에 둘 때).


...

@Conditional(ProfileCondition.class)

public @interface Profile { .. }


ProfileCondition구현은 오히려 쉽다, 그래서 우리는 전체 소스 코드를 표시 할 수 있습니다 :


class ProfileCondition implements Condition {


@Override

public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {

if (context.getEnvironment() != null) {

MultiValueMap<String, Object> attrs = metadata.getAllAnnotationAttributes(Profile.class.getName());

if (attrs != null) {

for (Object value : attrs.get("value")) {

if (context.getEnvironment().acceptsProfiles(((String[]) value))) {

return true;

}

}

return false;

}

}

return true;

}

}



보시다시피, 기본적으로 현재 환경을 살펴보고 주석에 지정된 환경 이름이 받아 들여지는지 확인합니다. 그렇다면 bean이 등록됩니다.


AnnotatedTypeMetadata인수는 주석 유형에 대한 메타 데이터를 보유하고 있습니다. 여기에는 모든 주석에 대한 정보가 포함됩니다. 여기서 흥미로운 부분은 반드시 클래스 로딩을 요구하지 않고 Spring이이 정보를 가져온다는 것입니다.




스프링 부트의 조건부 주석

Spring Boot는 조건 적 주석을 전혀 새로운 수준으로 취합니다. @Conditional*라이브러리 / 프레임 워크뿐만 아니라 응용 프로그램 개발자에게도 유용한 다양한 주석 이 제공됩니다 . 우리가 좋아하는 세 가지 주석을 살펴 보도록하겠습니다. 목록은 아직 완전하지 않다는 것을 명심하십시오. 따라서 조건부 제외 또는 콩 포함을 원할 때마다 org.springframework.boot.autoconfigure.condition패키지를 살펴보십시오 .


@ConditionalOnClass


ConditionalOnClass 는 주어진 클래스가 클래스 경로에서 발견 될 수있는 경우에만 Bean을 등록하는 데 사용될 수 있습니다. String 또는 Class<?>참조 를 통해 정규화 된 클래스 이름을 정의 할 수 있습니다 . 컴파일 타임에 사용할 수없는 클래스를 정의하고 가져 오기 때문에 닭고기와 달걀 같은 문제가 발생합니다. 하지만 스프링이 ASM 을 사용 하여 주석 메타 데이터를 수집 할 때 링크 오류가 발생하지 않고 현재 클래스 경로에없는 클래스를 참조하는 것이 가능합니다. 특히 다른 개발자에게 라이브러리 / 프레임 워크 클래스를 제공 할 때이 주석은 특정 클래스 (예 : 드라이버 클래스 등)를 기반으로 특정 bean을 활성화하는 데 사용될 수 있습니다.


@ConditionalOnWebApplication


ConditionalOnWebApplication 은 애플리케이션이 JEE 기반 서블릿 / 컨텍스트 / 웹 애플리케이션 컨텍스트에서 실행될 경우에만 존재하는 Bean을 정의하는 데 사용될 수 있습니다. 예를 들어, Spring Boot 기반의 JSF 애플리케이션을 개발할 때, 메타 주석으로 @Web사용할 수 있는 커스터마이징 주석 을 정의 할 수 있습니다 @ConditionalOnWebApplication.


...

@ConditionalOnWebApplication

public @interface Web { .. }



@ConditionalOnProperty


ConditionalOnProperty 는 지정된 값으로 특정 구성 등록 정보가있는 경우에만 Bean을 등록하는 데 사용될 수 있습니다. 이는 application.properties 파일의 값을 기반으로 특정 bean을 활성화하려는 경우에 유용합니다. 이 경우 구성 속성을 지정하는 것만으로도 충분합니다. 구성 속성을 지정하거나 지정 false하지 않으면 영향을받는 bean을 등록하지 않습니다.


@Configuration

@ConditionalOnProperty("my.feature.active")

public class MyFeatureConfiguration { ... }



개요

스프링 부트는 매우 멋진 조건부 주석 집합을 가지고 있습니다. 조건부 주석은 Spring 4.0의 Condition인터페이스와 주석에 기반합니다 @Conditional. Spring Boot를 사용하고 있다면 @Conditional*주석 중 하나가 어떤 시점에서 흥미로워 질 가능성이 매우 높습니다 .




참고 https://blog.andresteingress.com/2017/09/21/spring-boot-conditional-annotations

반응형

'IT > JAVA' 카테고리의 다른 글

[tomcat] Could not resolve type alias, Cannot find class 톰캣 에러  (0) 2018.11.20