여러 프로파일이 활성화되지 않은 경우 조건부로 Bean을 선언하려면 어떻게 해야 합니까?
Spring-Boot-App에서 로드되지 않은 스프링 프로파일에 따라 Bean을 조건부로 선언합니다.
조건:
Profile "a" NOT loaded
AND
Profile "b" NOT loaded
지금까지의 솔루션(실효하는 솔루션):
@Bean
@ConditionalOnExpression("#{!environment.getProperty('spring.profiles.active').contains('a') && !environment.getProperty('spring.profiles.active').contains('b')}")
public MyBean myBean(){/*...*/}
이 상태를 좀 더 우아하고 짧게 설명할 수 있는 방법이 있을까요?
특히 나는 여기서 봄 표현 언어의 사용을 없애고 싶다.
Spring 5.1.4(Spring Boot 2.1.2에 포함) 이후 프로파일스트링 주석 내에서 프로파일식을 사용할 수 있게 되었습니다.그래서:
스프링 5.1.4(스프링 부트 2.1.2) 이상에서는 다음과 같이 간단합니다.
@Component
@Profile("!a & !b")
public class MyComponent {}
Spring 4.x 및 5.0.x의 경우:
이번 Spring 버전에는 많은 접근법이 있으며 각각 장단점이 있습니다.커버할 조합이 별로 없을 때 저는 개인적으로 @Stanislav가 대답하는 것을 좋아합니다.@Conditional
주석입니다.
다른 접근법은 다음과 같은 유사한 질문에서 찾을 수 있습니다.
스프링 프로파일 - 2개의 프로파일을 추가하기 위한 AND 조건을 포함하는 방법
프로파일이 1개일 경우 단순히@Profile
Not 연산자를 사용한 주석.또한 여러 개의 프로파일을 받아들이지만,OR
조건.
따라서 주석과 함께 커스텀을 사용하는 방법도 있습니다.다음과 같은 경우:
public class SomeCustomCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
// Return true if NOT "a" AND NOT "b"
return !context.getEnvironment().acceptsProfiles("a")
&& !context.getEnvironment().acceptsProfiles("b");
}
}
그런 다음 다음과 같이 메서드에 주석을 추가합니다.
@Bean
@Conditional(SomeCustomCondition.class)
public MyBean myBean(){/*...*/}
저는 보다 상세하지만 두 가지 프로파일에만 적합한 이 솔루션을 선호합니다.
@Profile("!a")
@Configuration
public class NoAConfig {
@Profile("!b")
@Configuration
public static class NoBConfig {
@Bean
public MyBean myBean(){
return new MyBean();
}
}
}
아쉽게도, 더 짧은 솔루션은 없습니다만, 각 프로파일에 대해 같은 원두를 작성하는 것이 적절한 경우, 다음과 같은 방법을 검토해 주십시오.
@Configuration
public class MyBeanConfiguration {
@Bean
@Profile("a")
public MyBean myBeanForA() {/*...*/}
@Bean
@Profile("b")
public MyBean myBeanForB() {/*...*/}
@Bean
@ConditionalOnMissingBean(MyBean.class)
public MyBean myBeanForOthers() {/*...*/}
}
Spring 버전 5.0.x / Spring Boot 2.0.x까지의 @Stanislav answer를 조금 더 읽기 쉽게 한 변형입니다.
public class SomeCustomCondition implements Condition {
@Override
public boolean matches(final ConditionContext context, final AnnotatedTypeMetadata metadata) {
final Environment environment = context.getEnvironment();
// true if profile is NOT "a" AND NOT "b" AND NOT "c"
return !environment.acceptsProfiles("a", "b", "c");
}
}
Spring/Spring Boot의 새로운 버전은 f-CJ 답변을 참조하십시오.
언급URL : https://stackoverflow.com/questions/35429168/how-to-conditionally-declare-bean-when-multiple-profiles-are-not-active
'programing' 카테고리의 다른 글
wp_nav_menu() 현재 메뉴 항목에 "액티브" 클래스를 추가하는 방법(간단한 방법) (0) | 2023.02.14 |
---|---|
Wp Rest API 커스텀 엔드 포인트 POST 요청 (0) | 2023.02.14 |
스프링 부트 2.4.0 핸들러 타입InterceptorAdapter는 사용되지 않습니다. (0) | 2023.02.14 |
"좋아요"를 사용하여 MongoDB에 문의하는 방법 (0) | 2023.02.14 |
Angular에서 두 모델을 하나의 입력 필드에 바인딩하려면 어떻게 해야 합니까? (0) | 2023.02.14 |