[SPRING] 속성 자리 표시 자 값으로 @Profile 주석 사용
SPRING속성 자리 표시 자 값으로 @Profile 주석 사용
봄에 어떤 구성 요소에 대한 프로파일을 정의 할 때 우리는 다음과 같이 선언합니다. @Profile (value = "Prod"). 하지만 속성 파일에서 그 값을주고 싶습니다. 가능한가? 그렇다면 어떻게?
해결법
-
==============================
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.@Profile 주석을 남용하려고하는 것 같습니다. 기능을 사용하려면 프로파일을 사용하십시오. Bean이 특정 환경에서 활동 중임을 말하는 것이 아닙니다.
@Profile 주석을 남용하려고하는 것 같습니다. 기능을 사용하려면 프로파일을 사용하십시오. Bean이 특정 환경에서 활동 중임을 말하는 것이 아닙니다.
내 생각에 가까운 것을 달성하는 방법은 자신의 환경에 특정한 속성 파일을 갖는 것입니다. 속성 파일은 활성화되어 있어야하는 프로파일을 정의합니다. 이렇게하면 arg와 함께 앱을 시작할 수 있습니다.
--spring.profiles.active=prd
그러면 Spring Boot는 환경 특정 프로파일을 활성화 할 수있는 application-prd.properties를로드하려고 시도합니다.
spring.profiles.active=sqlserver,activedirectory,exchangeemail
그렇게하면 빈은 제공되는 기능이 필요할 때만 활성화됩니다.
-
==============================
3.대안은 ApplicationContext를 생성 할 때입니다 :
대안은 ApplicationContext를 생성 할 때입니다 :
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ConfigClass.class); String profile = aplicationContext.getEnvironemnt().getRequiredProperty("profile"); applicationContext.getEnvironment().setActiveProfiles(profile);
from https://stackoverflow.com/questions/25602249/using-profile-annotation-with-property-place-holder-value by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Mockito의 Spy object from Spring (0) | 2019.05.12 |
---|---|
[SPRING] Spring 데이터 Neo4j - repository.save와 @Indexed (unique = true) (0) | 2019.05.12 |
[SPRING] 주석 속성의 값은 상수 표현이어야합니다. (0) | 2019.05.12 |
[SPRING] Spring Batch - TaskletStep에서 건너 뛸 수있는 예외 (0) | 2019.05.12 |
[SPRING] 원래 수신 스레드 외부에서 HttpSession에 액세스 (0) | 2019.05.12 |