복붙노트

[SPRING] 정적 함수에서 @Value 주석의 대안

SPRING

정적 함수에서 @Value 주석의 대안

정적 변수에 @Value를 사용할 수 없습니다.

@Value("${some.value}")
static private int someValue;

static public void useValue() {
    System.out.println(someValue);
}

이렇게하면 0이 인쇄됩니다. 그래서 이것에 대한 좋은 대안은 무엇입니까?

해결법

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

    1.스프링은 정적 필드에 메모를 삽입합니다 (기본적으로).

    스프링은 정적 필드에 메모를 삽입합니다 (기본적으로).

    따라서 두 가지 대안이 있습니다.

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

    2.이 간단한 트릭을 사용하여 원하는 것을 얻으십시오 (비 정적 setter에 값을 주입하고 정적 필드를 작성하는 것보다 더 좋은 방법 - 승인 된 답변에서 제안 된 것처럼).

    이 간단한 트릭을 사용하여 원하는 것을 얻으십시오 (비 정적 setter에 값을 주입하고 정적 필드를 작성하는 것보다 더 좋은 방법 - 승인 된 답변에서 제안 된 것처럼).

    @Service
    public class ConfigUtil {
        public static ConfigUtil INSTANCE;
    
        @Value("${some.value})
        private String value;
    
        @PostConstruct
        public void init() {
            INSTANCE = this;        
        }
    
        public String getValue() {
            return value;
        }
    }
    

    다음과 같이 사용 :

    ConfigUtil.INSTANCE.getValue ();

  3. ==============================

    3.매우 자주 인스턴스화되는 클래스에서 정적이 아닌 필드를 만드는 동일한 값의 반복 주입을 방지하기 위해 해결 방법으로 간단한 Singleton ConfigUtil을 만드는 것이 좋습니다.

    매우 자주 인스턴스화되는 클래스에서 정적이 아닌 필드를 만드는 동일한 값의 반복 주입을 방지하기 위해 해결 방법으로 간단한 Singleton ConfigUtil을 만드는 것이 좋습니다.

    package de.agitos.app.util;
    
    import org.springframework.beans.factory.annotation.Configurable;
    import org.springframework.beans.factory.annotation.Value;
    
    /**
     * Helper class to get injected configuration values from static methods
     * 
     * @author Florian Sager
     *
     */
    
    @Configurable
    public class ConfigUtil {
    
        private static ConfigUtil instance = new ConfigUtil();
    
        public static ConfigUtil getInstance() {
            return instance;
        }
    
        private @Value("${my.value1}") Integer value1;
    
        public Integer getValue1() {
            return value1;
        }
    }
    

    클래스 내부에서 먼저 정적 Integer로 값을 주입하려고 시도했습니다.

    private static Integer value1 = ConfigUtil.getInstance().getValue1();
    
  4. from https://stackoverflow.com/questions/6897201/an-alternative-to-value-annotation-in-static-function by cc-by-sa and MIT license