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 클래스를 사용하여 조건을 분리 할 수 ​​있습니다.

@Configuration
// Some conditions
public class MyAutoConfiguration {

	// Auto-configured beans

	@Configuration
	@ConditionalOnClass(EmbeddedAcmeService.class)
	static class EmbeddedConfiguration {

		@Bean
		@ConditionalOnMissingBean
		public EmbeddedAcmeService embeddedAcmeService() { ... }

	}

}

@ConditionalOnClass 또는 @ConditionalOnMissingClass를 메타 어노테이션의 일부로 사용하여 작성한 어노테이션을 작성하는 경우,이 경우의 클래스를 참조하는 이름을 사용해야합니다.

49.3.2 Bean Conditions

@ConditionalOnBean과 @ConditionalOnMissingBean 어노테이션은 특정 빈의 유무에 따라 빈을 포함시킵니다. value 속성을 사용하여 타입 또는 이름별로 bean을 지정하여 bean을 이름별로 지정할 수 있습니다. 검색 속성을 사용하면 Bean을 검색 할 때 고려해야하는 ApplicationContext 계층 구조를 제한 할 수 있습니다.

@Bean 메서드에 놓을 때 대상 타입의 기본 값은 메서드의 반환 형식입니다 (다음 예제 참조).

@Configuration
public class MyAutoConfiguration {

	@Bean
	@ConditionalOnMissingBean
	public MyService myService() { ... }

}

앞의 예에서, 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