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

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



답변

당신은 autowire 할 수 있습니다 Environment

@Autowired
Environment env;

Environment 제공합니다 :


답변

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;
    }
}


답변