복붙노트

[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. ==============================

    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. ==============================

    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. ==============================

    3.필자는이 솔루션을 더 장황하지만 여전히 두 개의 프로파일에 대해서만 사용하는 것을 선호합니다.

    필자는이 솔루션을 더 장황하지만 여전히 두 개의 프로파일에 대해서만 사용하는 것을 선호합니다.

    @Profile("!a")
    @Configuration
    public class NoAConfig {
    
        @Profile("!b")
        @Configuration
        public static class NoBConfig {
            @Bean
            public MyBean myBean(){
                return new MyBean();
            }
        }
    
    }
    
  4. ==============================

    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() {/*...*/}
    
    }
    
  5. from https://stackoverflow.com/questions/35429168/how-to-conditionally-declare-bean-when-multiple-profiles-are-not-active by cc-by-sa and MIT license