spring
Spring의 조건부 빈 등록
수색…
비고
조건을 사용할 때주의해야 할 중요한 사항
- 조건 클래스는 직접 클래스 (스프링 빈이 아닌)로 참조되므로
@Value
속성 삽입을 사용할 수 없으므로 다른 스프링 빈을 그 안에 삽입 할 수 없습니다. - From java docs - 조건은
BeanFactoryPostProcessor
와 동일한 제한 사항을 따라야하며 bean 인스턴스와 결코 상호 작용하지 않도록주의해야합니다 .BeanFactoryPostProcessor
는 Bean 정의와 상호 작용하고 수정할 수 있지만 인스턴스는 bean 화하지 않을 수도있다. 그렇게하면 조기에 bean 인스턴스화가 발생하고 컨테이너를 위반하여 의도하지 않은 부작용이 발생할 수 있습니다.
특성 또는 값이 지정된 경우에만 Bean 등록
스프링 빈은 특정 값을 가지 거나 지정된 속성이 충족 될 때만 등록되도록 구성 할 수 있습니다. 이렇게하려면 Condition.matches
를 구현하여 속성 / 값을 확인하십시오.
public class PropertyCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return context.getEnvironment().getProperty("propertyName") != null;
// optionally check the property value
}
}
Java 구성에서 위의 구현을 bean을 등록하는 조건으로 사용하십시오. @Conditional 어노테이션 사용에주의하십시오.
@Configuration
public class MyAppConfig {
@Bean
@Conditional(PropertyCondition.class)
public MyBean myBean() {
return new MyBean();
}
}
PropertyCondition
에서는 여러 조건을 평가할 수 있습니다. 그러나 각 조건을 느슨하게 결합 된 상태로 유지하기 위해 구현을 분리하는 것이 좋습니다. 예 :
@Configuration
public class MyAppConfig {
@Bean
@Conditional({PropertyCondition.class, SomeOtherCondition.class})
public MyBean myBean() {
return new MyBean();
}
}
조건 주석
main @conditional
주 Annotation을 제외하고는 다른 경우에 사용될 비슷한 annotation이있다.
수업 조건
@ConditionalOnClass
및 @ConditionalOnMissingClass
주석은 특정 클래스의 유무에 따라 구성을 포함 할 수 있습니다.
예를 들어 OObjectDatabaseTx.class
가 종속성에 추가되고 OrientWebConfigurer
빈이 없으면 구성 OrientWebConfigurer
만듭니다.
@Bean
@ConditionalOnWebApplication
@ConditionalOnClass(OObjectDatabaseTx.class)
@ConditionalOnMissingBean(OrientWebConfigurer.class)
public OrientWebConfigurer orientWebConfigurer() {
return new OrientWebConfigurer();
}
콩 조건
@ConditionalOnBean
과 @ConditionalOnMissingBean
어노테이션은 특정 빈의 유무에 따라 빈을 포함 할 수 있도록한다. value 속성을 사용하여 유형별로 빈을 지정하거나 이름을 사용하여 빈을 지정하는 이름을 지정할 수 있습니다. 검색 속성을 사용하면 Bean을 검색 할 때 고려해야하는 ApplicationContext
계층 구조를 제한 할 수 있습니다.
정의 된 bean이 있는지 여부를 확인할 때 위의 예를 참조하십시오.
부동산 조건
@ConditionalOnProperty
주석은 Spring 환경 속성을 기반으로 구성이 포함되도록합니다. 접두어 및 이름 속성을 사용하여 확인할 속성을 지정합니다. 기본적으로 존재하고 false
가 아닌 모든 특성이 일치합니다. 또한 havingValue
및 matchIfMissing
속성을 사용하여 고급 검사를 만들 수도 있습니다.
@ConditionalOnProperty(value='somebean.enabled', matchIfMissing = true, havingValue="yes")
@Bean
public SomeBean someBean(){
}
리소스 조건
@ConditionalOnResource
주석은 특정 리소스가있는 경우에만 구성을 포함 할 수 있도록합니다.
@ConditionalOnResource(resources = "classpath:init-db.sql")
웹 응용 프로그램 조건
@ConditionalOnWebApplication
및 @ConditionalOnNotWebApplication
주석은 응용 프로그램이 '웹 응용 프로그램'인지 여부에 따라 구성을 포함 할 수 있습니다.
@Configuration
@ConditionalOnWebApplication
public class MyWebMvcAutoConfiguration {...}
SpEL 발현 조건
@ConditionalOnExpression
주석은 SpEL 표현식의 결과를 기반으로 구성이 포함되도록합니다.
@ConditionalOnExpression("${rest.security.enabled}==false")