복붙노트

[SPRING] 속성 자리 표시 자 값으로 @Profile 주석 사용

SPRING

속성 자리 표시 자 값으로 @Profile 주석 사용

봄에 어떤 구성 요소에 대한 프로파일을 정의 할 때 우리는 다음과 같이 선언합니다. @Profile (value = "Prod"). 하지만 속성 파일에서 그 값을주고 싶습니다. 가능한가? 그렇다면 어떻게?

해결법

  1. ==============================

    1.Spring의 소스 코드를 살펴보면서, 당신이 요구하는 것이 불가능하다는 결론에 도달했습니다. 이를 명확히하기 위해 Spring이 @Profile 내에서 $ {property}를 평가하도록하는 것은 불가능합니다.

    Spring의 소스 코드를 살펴보면서, 당신이 요구하는 것이 불가능하다는 결론에 도달했습니다. 이를 명확히하기 위해 Spring이 @Profile 내에서 $ {property}를 평가하도록하는 것은 불가능합니다.

    프로필이 활성 상태인지 여부를 확인하는 ProfileCondition을 살펴보십시오.

    class ProfileCondition implements Condition {
    
        @Override
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
            if (context.getEnvironment() != null) {
                MultiValueMap<String, Object> attrs = metadata.getAllAnnotationAttributes(Profile.class.getName());
                if (attrs != null) {
                    for (Object value : attrs.get("value")) {
                        if (context.getEnvironment().acceptsProfiles(((String[]) value))) {
                            return true;
                        }
                    }
                    return false;
                }
            }
            return true;
        }
    
    }
    

    고기는 context.getEnvironment (). acceptsProfiles (((String []) value))입니다.

    이제 acceptsProfiles가 상주하는 AbstractEnvironment의 소스를 확인하면 컨트롤이

    protected boolean isProfileActive(String profile) {
        validateProfile(profile);
        return doGetActiveProfiles().contains(profile) ||
                (doGetActiveProfiles().isEmpty() && doGetDefaultProfiles().contains(profile));
    }
    

    표현식을 평가하려고하지는 않지만 String을 그대로 사용합니다 (또한 isProfileActive가 평가되는 String 표현식 중 하나가 아니기 때문에)

    위와 여기에서 언급 한 코드를 찾을 수 있습니다.

    또 다른 메모는 왜 동적 프로필 이름이 필요한지 잘 모르겠습니다.

  2. ==============================

    2.@Profile 주석을 남용하려고하는 것 같습니다. 기능을 사용하려면 프로파일을 사용하십시오. Bean이 특정 환경에서 활동 중임을 말하는 것이 아닙니다.

    @Profile 주석을 남용하려고하는 것 같습니다. 기능을 사용하려면 프로파일을 사용하십시오. Bean이 특정 환경에서 활동 중임을 말하는 것이 아닙니다.

    내 생각에 가까운 것을 달성하는 방법은 자신의 환경에 특정한 속성 파일을 갖는 것입니다. 속성 파일은 활성화되어 있어야하는 프로파일을 정의합니다. 이렇게하면 arg와 함께 앱을 시작할 수 있습니다.

    --spring.profiles.active=prd
    

    그러면 Spring Boot는 환경 특정 프로파일을 활성화 할 수있는 application-prd.properties를로드하려고 시도합니다.

    spring.profiles.active=sqlserver,activedirectory,exchangeemail
    

    그렇게하면 빈은 제공되는 기능이 필요할 때만 활성화됩니다.

  3. ==============================

    3.대안은 ApplicationContext를 생성 할 때입니다 :

    대안은 ApplicationContext를 생성 할 때입니다 :

    ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ConfigClass.class);
    String profile = aplicationContext.getEnvironemnt().getRequiredProperty("profile");
    applicationContext.getEnvironment().setActiveProfiles(profile);
    
  4. from https://stackoverflow.com/questions/25602249/using-profile-annotation-with-property-place-holder-value by cc-by-sa and MIT license