복붙노트

[SPRING] application.properties에서 정적 변수에 값을 할당하는 방법은 무엇입니까?

SPRING

application.properties에서 정적 변수에 값을 할당하는 방법은 무엇입니까?

나는 Spring MVC를 사용하고있다. 정적 변수가 많은 @Service로 주석 된 UserService 클래스가 있습니다. 나는 그것들을 application.properties 파일의 값으로 인스턴스화하고 싶다.

예를 들어 application.properties의 경우 : SVN_URL = http : //some.url/repositories

다음 클래스에 있습니다 : @Value ( "$ {SVN_URL}") private static String SVN_URL

나는 빈의 인스턴스화를 실패했다. 상자가 된 예외는 java.lang.ExceptionInInitializerError입니다.

나는 또한 @Autowired 개인 정적 환경 env를 시도했다;

그리고 나서 : private static String SVN_URL = env.getProperty ( "SVN_URL");

동일한 오류가 발생합니다.

해결법

  1. ==============================

    1.문제에 대해 잠시 생각해보십시오. 정적 필드에서 application.properties의 속성을 유지할 필요가 없습니다. Patrick이 제안한 "해결 방법"은 매우 더러운 것입니다.

    문제에 대해 잠시 생각해보십시오. 정적 필드에서 application.properties의 속성을 유지할 필요가 없습니다. Patrick이 제안한 "해결 방법"은 매우 더러운 것입니다.

    @Service annotation으로 bean을 제어 할 때 Spring Container에 생성을 위임한다는 것을 명심하라. Spring은 전체 애플리케이션에서 공유되는 하나의 빈을 만듦으로써이 빈 수명주기를 제어한다. 물론이 동작을 변경할 수는 있지만 여기서 기본 동작을 참조한다. 이 경우 모든 정적 필드에는 의미가 없습니다. Spring은 UserService 인스턴스가 하나만 있는지 확인합니다. 정적 필드 초기화는 Spring 컨테이너가 시작되기 전에 많은 프로세서 사이클에서 발생하기 때문에 설명 된 오류가 발생합니다. 여기서 정적 필드가 초기화되는시기에 대해 자세히 알 수 있습니다.

    이런 식으로하는 것이 훨씬 낫습니다.

    @Service
    public class UserService {
        private final String svnUrl;
    
        @Autowired
        public UserService(@Value("${SVN_URL}") String svnUrl) {
            this.svnUrl = svnUrl;
        }
    }
    

    이 접근법은 다음과 같은 이유로 더 좋습니다.

    또한 하나의 클래스에 여러 속성을로드하는 또 다른 방법이 있습니다. 구성 클래스에로드하려는 모든 값에 대해 접두어를 사용해야합니다. 다음 예제를 고려하십시오.

    @ConfigurationProperties(prefix = "test")
    public class TestProperties {
    
        private String svnUrl;
    
        private int somePort;
    
        // ... getters and setters
    }
    

    Spring은 TestProperties 클래스 초기화 (testProperties 빈을 생성)를 처리 할 것이고 당신은이 객체를 Spring 컨테이너에 의해 초기화 된 다른 빈에 삽입 할 수있다. 다음은 모범적 인 application.properties 파일의 모습입니다.

    test.svnUrl=https://svn.localhost.com/repo/
    test.somePort=8080
    

    Baeldung은 그의 블로그에서이 주제에 대한 훌륭한 글을 올렸습니다. 더 많은 정보를 얻기 위해 그것을 읽는 것이 좋습니다.

    정적 컨텍스트에서 값을 사용하는 것이 필요하다면 public static final 필드를 사용하여 일부 공용 클래스를 정의하는 것이 좋습니다. 클래스 로드러가이 클래스를로드하고 응용 프로그램 수명 동안 수정되지 않을 때이 값이 인스턴스화됩니다. 유일한 문제는 Spring의 application.properties 파일에서 이러한 값을로드 할 수 없다는 것입니다. 코드에서 직접 값을 유지해야합니다 (또는 속성 파일에서 이러한 상수 값을로드하는 클래스를 구현할 수도 있지만 이것은 당신이 해결하려고하는 문제에 너무 장황하게 들립니다).

  2. ==============================

    2.스프링은 정적 변수에 값을 삽입 할 수 없습니다.

    스프링은 정적 변수에 값을 삽입 할 수 없습니다.

    해결 방법은 비 정적 setter를 만들어 값을 정적 변수에 할당하는 것입니다.

    @Service
    public class UserService {
    
        private static String SVN_URL;
    
        @Value("${SVN_URL}")
        public void setSvnUrl(String svnUrl) {
            SVN_URL = svnUrl;
        }
    
    }
    
  3. from https://stackoverflow.com/questions/45192373/how-to-assign-a-value-from-application-properties-to-a-static-variable by cc-by-sa and MIT license