스프링 프로파일 컬렉션을 무효로 할 수 있습니까?
프로파일 그룹에서 사용하지 않도록 빈을 설정할 수 있습니까?현재 이 작업은 수행할 수 있습니다(내 생각에는).
@Profile("!dev, !qa, !local")
이를 실현하기 위한 더 깔끔한 표기법이 있습니까?프로파일이 많다고 가정해 봅시다.또, 어떤 서비스(또는 그 무엇)를 Mock으로 구체적으로 실장하고 있는 경우, 그 중 하나에 주석을 달아 다른 하나는 다른 모든 경우에 사용한다고 가정해도 될까요?즉, 예를 들어 이것이 필요한가?
@Profile("dev, prof1, prof2")
public class MockImp implements MyInterface {...}
@Profile("!dev, !prof1, !prof2") //assume for argument sake that there are many other profiles
public class RealImp implements MyInterface {...}
중 요?@Primary른?
요점은 다음과 같습니다.
@Profile("!(dev, prof1, prof2)")
잘 부탁드립니다!
Spring 5.1(Spring Boot 2.1에 포함) 이후 프로파일 문자열 주석 내에서 프로파일식을 사용할 수 있게 되었습니다(자세한 내용은 Profile.of(..)의 설명을 참조하십시오).
따라서 특정 프로파일에서 콩을 제외하려면 다음과 같은 식을 사용할 수 있습니다.
@Profile("!dev & !prof1 & !prof2")
다음과 같은 다른 논리 연산자도 사용할 수 있습니다.
@Profile("test | local")
간단한 답변: Spring 5.1 이전 버전(Spring Boot 2.1 이전 버전)에서는 사용할 수 없습니다.
하지만, 이 문제 덕분에 깔끔한 해결 방법이 있습니다.@Conditional석입니니다다
조건 입력자 작성:
public static abstract class ProfileCondition extends SpringBootCondition {
@Override
public ConditionOutcome getMatchOutcome(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
if (matchProfiles(conditionContext.getEnvironment())) {
return ConditionOutcome.match("A local profile has been found.");
}
return ConditionOutcome.noMatch("No local profiles found.");
}
protected static abstract boolean matchProfiles(final Environment environment);
}
public class DevProfileCondition extends ProfileCondition {
protected boolean matchProfiles(final Environment environment) {
return Arrays.stream(environment.getActiveProfiles()).anyMatch(prof -> {
return prof.equals("dev") || prof.equals("prof1") || prof.equals("prof2");
});
}
}
public static class ProdProfileCondition extends ProfileCondition {
protected boolean matchProfiles(final Environment environment) {
return Arrays.stream(environment.getActiveProfiles()).anyMatch(prof -> {
return (!prof.equals("dev") && !prof.equals("prof1") && !prof.equals("prof2"));
});
}
}
사용하다
@Conditional(value = {DevProfileCondition.class})
public class MockImpl implements MyInterface {...}
@Conditional(value = {ProdProfileCondition.class})
public class RealImp implements MyInterface {...}
단, 이 어프로치에서는 Springboot이 필요합니다.
제가 알기로는, 당신이 원하는 것은 당신의 일부 콩을 특정 프로파일에 맞는 stub/mock 콩으로 대체할 수 있는 것으로 알고 있습니다.이 문제에 대처하는 방법에는 다음 2가지가 있습니다.
- 해당 프로파일에 불필요한 콩 제외 및 기본적으로 모든 항목 포함
- 각 프로파일에 필요한 콩만 포함
첫 번째 옵션은 실현 가능하지만 어렵다.은, 「스프링」으로 의이, 「스프링」으로 설정되어 있기 입니다.@Profile은 '주석'입니다.OR이 아님)AND(일부러)이러한 스프링의 동작은 보다 직관적입니다.이는 각 프로파일이 애플리케이션의 각 구성(생산, 유닛 테스트, 통합 테스트 등)에 대응해야 하기 때문입니다.따라서 한 번에 활성화되는 프로파일은 1개뿐입니다.이 OR이 OR보다 더 입니다.AND프로파일 사이에 있습니다.그 결과, 프로파일을 네스트 하는 것으로, 이 제한을 회피할 수 있습니다만, 설정이 매우 복잡하고 유지보수가 어려워집니다.
그래서 두 번째 방법을 택할 것을 제안합니다.애플리케이션의 각 구성에 대해 단일 프로파일을 가집니다.모든 구성에 대해 동일한 콩을 모두 클래스 내에 배치할 수 있으며,@Profile명시된.그 결과, 이러한 콩은 모든 프로파일에 의해 인스턴스화 됩니다.다른 설정별로 다른 콩에 대해 다른 콩을 작성해야 합니다.@Configuration(스프링 프로파일별로) 클래스, 모든 클래스 및@Profile대응하는 프로파일로 설정합니다.이렇게 하면 모든 경우에 주입된 것을 추적하기가 매우 쉬워질 것입니다.
이것은 다음과 같습니다.
@Profile("dev")
public class MockImp implements MyInterface {...}
@Profile("prof1")
public class MockImp implements MyInterface {...}
@Profile("prof2")
public class MockImp implements MyInterface {...}
@Profile("the-last-profile") //you should define an additional profile, not rely on excluding as described before
public class RealImp implements MyInterface {...}
지난,@Primary주석을 사용하여 기존 콩을 덮어씁니다.같은 종류의 콩이 2개일 때, 만약 없다면@Primary주석, 스프링에서 인스턴스화 오류가 발생합니다.를 정의하는 경우@Primary어느 한 쪽의 콩에 대한 주석으로, 에러는 발생하지 않고, 이 콩은 이 타입이 필요한 모든 장소에 주입됩니다(다른 한쪽은 무시됩니다.보시는 바와 같이 이것은 프로파일이1개일 경우에만 도움이 됩니다.그렇지 않으면, 이 또한 첫 번째 선택으로 복잡해질 것입니다.
TL;DR: 네, 할 수 있습니다.각 유형에 대해 각 프로파일에 대해 1개의 빈을 추가합니다.@Profile이 프로파일만 있는 주석.
언급URL : https://stackoverflow.com/questions/43168881/can-i-negate-a-collection-of-spring-profiles
'programing' 카테고리의 다른 글
| React Native for Production에서 소스 맵을 추가하는 방법 (0) | 2023.03.11 |
|---|---|
| 이벤트를 제외한 모든 위치 클릭 (0) | 2023.03.11 |
| 발신 JSON 타임스탬프 포맷 방법 (0) | 2023.03.11 |
| Redex: 백엔드 퍼시스턴스 방법에 대한 의견/예: (0) | 2023.03.11 |
| 태그와 관련된 게시물을 출력합니다. (0) | 2023.03.11 |