Spring에서 프로그래밍 방식으로 현재 활성 / 기본 환경 프로파일을 얻는 방법은 무엇입니까?


155

다른 현재 환경 프로파일에 따라 다른 로직을 코딩해야합니다. Spring에서 현재 활성 및 기본 프로파일을 어떻게 얻을 수 있습니까?


3
@aweigold : 스프링 3.1에서 프로그래밍 방식으로 현재 활성 / 기본 환경 프로파일을 가져옵니다. 더 자세한 정보가 필요하십니까?
Bobo

답변:



75

User1648825의 멋진 간단한 답변 확장 (댓글을 달 수 없으며 편집이 거부되었습니다) :

@Value("${spring.profiles.active}")
private String activeProfile;

프로파일이 설정되어 있지 않으면 (널값을 얻음) IllegalArgumentException이 발생할 수 있습니다. 설정이 필요한 경우 좋은 일이 될 수 있습니다. @Value에 'default'구문을 사용하지 않는 경우 :

@Value("${spring.profiles.active:Unknown}")
private String activeProfile;

... spring.profiles.active를 해결할 수없는 경우 activefile에 '알 수 없음'이 포함됩니다.


프로필 이름은 쉼표로 구분됩니다. Checkout baeldung.com/spring-profiles#2-using-springactiveprofile
Jason

56

보다 완벽한 예는 다음과 같습니다.

자동 와이어 환경

먼저 환경 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


2
@Profile이 최고의 솔루션 인 것 같습니다.
Paul Waldo

나는 모든 중괄호마다 별도의 선으로 눈을 멀게합니다. Java 코딩 표준이 아닙니다.
user1567291

26
@Value("${spring.profiles.active}")
private String activeProfile;

작동하며 EnvironmentAware를 구현할 필요가 없습니다. 그러나 나는이 접근법의 단점을 모른다.


3
이 줄은이 오류를 제공합니다 :Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.profiles.active' in value "${spring.profiles.active}"
zygimantus

나를 위해 완벽하게 작동합니다. 스프링 부트 사용하기 1.5.15.
рüффп

프로파일이 정의되면 값이 구문 분석되고 그렇지 않으면 예외가 발생한다고 생각합니다. 모든 상황에 맞지는 않습니다.
WesternGun

1
활성 프로파일도 배열이 될 수 있으므로주의하십시오. 이러한 방법으로 프로파일을 추가 할 때 예기치 않은 오류가 발생할 수 있습니다.
Alex Efimov 2016 년

이 접근법의 단점은 Spring이 평가할 때 고려할 수있는 모든 프로파일을 얻지 못한다는 것입니다 @Profile. 앱은 spring.profiles.include 속성 을 사용할 수도 있고을 사용하여 초기화하는 동안 프로그래밍 방식으로 프로필을 설정할 수 있습니다 ConfigurableEnvironment. Environment.getActiveProfiles()이러한 메커니즘 중 하나를 사용하여 설정된 전체 프로필 목록을 가져옵니다.
Scott Frederick


0

정적으로 액세스 할 수있는 요구가있는 것 같습니다.

스프링이 아닌 클래스의 정적 메소드에서 어떻게 그런 것을 얻을 수 있습니까? – 에테르

그것은 해킹이지만, 자신의 클래스를 작성하여 노출시킬 수 있습니다. 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;
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.