[SPRING] 여러 프로필이 활성화되지 않은 경우 조건부로 Bean을 선언하는 방법?
SPRING여러 프로필이 활성화되지 않은 경우 조건부로 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 Expression Language의 사용법을 없애고 싶습니다.
해결법
-
==============================
1.스프링 5.1 (스프링 부트 2.1에 통합) 이후로 프로파일 스트링 주석 내부에 프로파일 표현을 사용할 수 있습니다. 그래서:
스프링 5.1 (스프링 부트 2.1에 통합) 이후로 프로파일 스트링 주석 내부에 프로파일 표현을 사용할 수 있습니다. 그래서:
Spring 5.1 (Spring Boot 2.1) 이상에서는 다음과 같이 쉽습니다.
@Component @Profile("!a & !b") public class MyComponent {}
Spring 4.x 및 5.0.x :
이 Spring 버전에는 많은 접근법이 있으며, 각각은 프로와 콘을 가지고있다. 커버해야 할 조합이 많지 않을 때 @Stanislav가 @Conditional 주석으로 개인적으로 대답하는 것을 좋아합니다.
이와 유사한 질문에서 다른 접근법을 찾을 수 있습니다.
스프링 프로파일 - 2 개의 프로파일을 추가하기위한 AND 조건을 포함시키는 방법은 무엇입니까?
봄 : 프로필에서 어떻게 할 것인가?
-
==============================
2.프로필이 하나 뿐인 경우 not 연산자에 @Profile 주석을 사용할 수 있습니다. 또한 여러 프로필을 허용하지만 OR 조건을 사용합니다.
프로필이 하나 뿐인 경우 not 연산자에 @Profile 주석을 사용할 수 있습니다. 또한 여러 프로필을 허용하지만 OR 조건을 사용합니다.
그래서, 대안의 해결책은 @Conditional 어노테이션으로 커스텀 Condition을 사용하는 것입니다. 이렇게 :
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(){/*...*/}
-
==============================
3.필자는이 솔루션을 더 장황하지만 여전히 두 개의 프로파일에 대해서만 사용하는 것을 선호합니다.
필자는이 솔루션을 더 장황하지만 여전히 두 개의 프로파일에 대해서만 사용하는 것을 선호합니다.
@Profile("!a") @Configuration public class NoAConfig { @Profile("!b") @Configuration public static class NoBConfig { @Bean public MyBean myBean(){ return new MyBean(); } } }
-
==============================
4.불행히도 나는 더 짧은 해결책을 갖고 있지 않지만 각 프로파일에 대해 동일한 bean을 작성하는 것이 적합한 경우 다음 접근 방식을 고려할 수 있습니다.
불행히도 나는 더 짧은 해결책을 갖고 있지 않지만 각 프로파일에 대해 동일한 bean을 작성하는 것이 적합한 경우 다음 접근 방식을 고려할 수 있습니다.
@Configuration public class MyBeanConfiguration { @Bean @Profile("a") public MyBean myBeanForA() {/*...*/} @Bean @Profile("b") public MyBean myBeanForB() {/*...*/} @Bean @ConditionalOnMissingBean(MyBean.class) public MyBean myBeanForOthers() {/*...*/} }
from https://stackoverflow.com/questions/35429168/how-to-conditionally-declare-bean-when-multiple-profiles-are-not-active by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring @ResponseBody Jackson JsonSerializer with JodaTime (0) | 2018.12.26 |
---|---|
[SPRING] SpringServletContainerInitializer를 javax.servlet.ServletContainerInitializer에 캐스팅 할 수 없습니다. (0) | 2018.12.26 |
[SPRING] Spring ContextRefreshedevent가 두 번 호출되는 이유는 무엇입니까? (0) | 2018.12.26 |
[SPRING] 스프링 데이터 mongodb - '커서'옵션이 필요합니다. (0) | 2018.12.26 |
[SPRING] Spring REST - .zip 파일을 만들어 클라이언트로 보냅니다. (0) | 2018.12.26 |