programing

여러 프로파일이 활성화되지 않은 경우 조건부로 Bean을 선언하려면 어떻게 해야 합니까?

firstcheck 2023. 2. 14. 22:18
반응형

여러 프로파일이 활성화되지 않은 경우 조건부로 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 조건을 포함하는 방법

스프링: 프로파일에서 AND를 수행하는 방법

프로파일이 1개일 경우 단순히@ProfileNot 연산자를 사용한 주석.또한 여러 개의 프로파일을 받아들이지만,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

반응형