49.3 Condition 어노테이션들 by sh
거의 항상 자동 구성 클래스에 하나 이상의 @Conditional 어노테이션을 포함하고자 합니다. @ConditionalOnMissingBean 어노테이션은 개발자가 기본값에 만족하지 않는 경우 자동 구성을 무시할 수 있도록 하는 데 사용되는 일반적인 예입니다.
Spring Boot는 @Configuration 클래스 또는 개별 @Bean 메소드에 어노테이션을 달아 자신의 코드에서 재사용 할 수있는 여러 개의 @Conditional 어노테이션을 포함합니다. 이러한 어노테이션은 아래의 내용들을 포함합니다.
49.3.1 Class Conditions
@ConditionalOnClass 및 @ConditionalOnMissingClass 어노테이션은 @Configuration 클래스가 특정 클래스의 유무에 따라 포함되도록 합니다. 어노테이션 메타 데이터는 ASM을 사용하여 구문 분석되므로 사실 클래스가 실제로 실행중인 클래스 경로에 나타나지 않을지라도 value 속성을 사용하여 실제 클래스를 참조 할 수 있습니다. String 값을 사용하여 클래스 이름을 지정하려는 경우 name 속성을 사용할 수도 있습니다.
이 메카니즘은 일반적으로 리턴 타입이 condition의 대상인 @Bean 메소드와 같은 방식으로 적용되지 않습니다 : 메소드의 조건이 적용되기 전에 JVM은 클래스와 잠재적으로 처리 된 메소드 참조(클래스가 존재하지 않으면 실패할)를 로드 할 것입니다.
이 시나리오를 처리하기 위해 다음 예제와 같이 별도의 @Configuration 클래스를 사용하여 조건을 분리 할 수 있습니다.
@ConditionalOnClass 또는 @ConditionalOnMissingClass를 메타 어노테이션의 일부로 사용하여 작성한 어노테이션을 작성하는 경우,이 경우의 클래스를 참조하는 이름을 사용해야합니다.
49.3.2 Bean Conditions
@ConditionalOnBean과 @ConditionalOnMissingBean 어노테이션은 특정 빈의 유무에 따라 빈을 포함시킵니다. value 속성을 사용하여 타입 또는 이름별로 bean을 지정하여 bean을 이름별로 지정할 수 있습니다. 검색 속성을 사용하면 Bean을 검색 할 때 고려해야하는 ApplicationContext 계층 구조를 제한 할 수 있습니다.
@Bean 메서드에 놓을 때 대상 타입의 기본 값은 메서드의 반환 형식입니다 (다음 예제 참조).
앞의 예에서, MyService 유형의 Bean이 ApplicationContext에 이미 포함되어 있지 않으면 myService Bean이 작성됩니다.
Bean 정의가 추가되는 순서는 매우 조심해야합니다. 이러한 조건은 지금까지 처리 된 내용을 기반으로 평가됩니다. 이러한 이유 때문에 자동 구성 클래스에서는 @ConditionalOnBean 및 @ConditionalOnMissingBean 어노테이션만 사용하는 것이 좋습니다 (사용자 정의 Bean 정의가 추가 된 후에 로드 될 것이므로).
@ConditionalOnBean과 @ConditionalOnMissingBean은 @Configuration 클래스가 생성되는 것을 막지 않습니다. 클래스 수준에서 이러한 조건을 사용하는 것과 포함 된 @Bean 메서드를 어노테이션으로 표시하는 것의 유일한 차이점은 조건이 일치하지 않으면 전자가 Bean으로 @Configuration 클래스를 등록하지 못하게하는 것입니다.
49.3.3 Property Conditions
@ConditionalOnProperty 주석은 Spring Environment 속성을 기반으로 구성이 포함되도록합니다. prefix 및 name 속성을 사용하여 확인할 속성을 지정합니다. 기본적으로 존재하고 false가 아닌 모든 특성이 일치합니다. havingValue 및 matchIfMissing 특성을 사용하여 고급 검사를 만들 수도 있습니다.
prefix 속성에 해당되는 프로퍼티 값이 있다면 실행됨.
예) @ConditionalOnProperty(prefix = "autoconfig.sample", name = "id")
49.3.4 Resource Conditions
@ConditionalOnResource 어노테이션은 특정 리소스가있는 경우에만 구성을 포함시킵니다. 다음 예제와 같이 일반적인 스프링 규칙을 사용하여 리소스를 지정할 수 있습니다. file : /home/user/test.dat.
리소스 경로에 파일이 있으면 실행되는 어노테이션.
예) @ConditionalOnResource(resources = "classpath:/META-INF/resourcesfile")
49.3.5 Web Application Conditions
@ConditionalOnWebApplication 및 @ConditionalOnNotWebApplication 어노테이션은 응용 프로그램이 "웹 응용 프로그램"인지 여부에 따라 구성을 포함시킵니다. 웹 애플리케이션은 스프링 WebApplicationContext를 사용하거나 세션 범위를 정의하거나 StandardServletEnvironment를 갖는 애플리케이션입니다.
웹인지 아닌지 판단하는 어노테이션. 웹일 때 실행됨! 별거 없대..
예) @ConditionalOnWebApplication
49.3.6 SpEL Expression Conditions
@ConditionalOnExpression 어노테이션은 SpEL expression의 결과에 따라 구성을 포함시킵니다.
Last updated
Was this helpful?