다른 현재 환경 프로파일에 따라 다른 로직을 코딩해야합니다. Spring에서 현재 활성 및 기본 프로파일을 어떻게 얻을 수 있습니까?
답변
답변
User1648825의 멋진 간단한 답변 확장 (댓글을 달 수 없으며 편집이 거부되었습니다) :
@Value("${spring.profiles.active}")
private String activeProfile;
프로파일이 설정되어 있지 않으면 (널값을 얻음) IllegalArgumentException이 발생할 수 있습니다. 설정이 필요한 경우 좋은 일이 될 수 있습니다. @Value에 ‘default’구문을 사용하지 않는 경우 :
@Value("${spring.profiles.active:Unknown}")
private String activeProfile;
… spring.profiles.active를 해결할 수없는 경우 activefile에 ‘알 수 없음’이 포함됩니다.
답변
보다 완벽한 예는 다음과 같습니다.
자동 와이어 환경
먼저 환경 Bean을 자동 와이어 링하려고합니다.
@Autowired
private Environment environment;
활성 프로파일에 프로파일이 있는지 확인
그런 다음 getActiveProfiles()
활성 프로파일 목록에 프로파일이 있는지 확인할 수 있습니다 . 다음은 String[]
from getActiveProfiles()
을 가져 와서 해당 배열에서 스트림을 가져온 다음 matcher를 사용하여 부울을 반환하는 여러 프로필 (Case-Insensitive)을 확인 하는 예제입니다 .
//Check if Active profiles contains "local" or "test"
if(Arrays.stream(environment.getActiveProfiles()).anyMatch(
env -> (env.equalsIgnoreCase("test")
|| env.equalsIgnoreCase("local")) ))
{
doSomethingForLocalOrTest();
}
//Check if Active profiles contains "prod"
else if(Arrays.stream(environment.getActiveProfiles()).anyMatch(
env -> (env.equalsIgnoreCase("prod")) ))
{
doSomethingForProd();
}
또한 주석을 사용하여 유사한 기능을 수행 할 수 있습니다. @Profile("local")
프로파일 허용은 전달 된 또는 환경 매개 변수를 기반으로 선택적 구성을 허용합니다. 이 기술에 대한 자세한 정보는 다음과 같습니다. Spring Profiles
답변
@Value("${spring.profiles.active}")
private String activeProfile;
작동하며 EnvironmentAware를 구현할 필요가 없습니다. 그러나 나는이 접근법의 단점을 모른다.
답변
자동 배선을 사용하지 않는 경우 간단히 구현 EnvironmentAware
답변
정적으로 액세스 할 수있는 요구가있는 것 같습니다.
스프링이 아닌 클래스의 정적 메소드에서 어떻게 그런 것을 얻을 수 있습니까? – 에테르
그것은 해킹이지만, 자신의 클래스를 작성하여 노출시킬 수 있습니다. SpringContext.getEnvironment()
이 컴포넌트가 인스턴스화 될시기를 보장 할 수 없으므로 모든 Bean이 작성되기 전에 아무것도 호출하지 않도록주의해야합니다 .
@Component
public class SpringContext
{
private static Environment environment;
public SpringContext(Environment environment) {
SpringContext.environment = environment;
}
public static Environment getEnvironment() {
if (environment == null) {
throw new RuntimeException("Environment has not been set yet");
}
return environment;
}
}