Spring : 정적 필드에 값을 주입하는 방법은 무엇입니까?


90

이 수업으로

@Component
public class Sample {

    @Value("${my.name}")
    public static String name;


}

시도하면 Sample.name항상 'null'입니다. 그래서 저는 이것을 시도했습니다.

public class Sample {

    public static String name;

    @PostConstruct
    public void init(){
        name = privateName;
    }

    @Value("${my.name}")
    private String privateName;

    public String getPrivateName() {
        return privateName;
    }

    public void setPrivateName(String privateName) {
        this.privateName = privateName;
    }  

}

이 코드는 작동합니다. Sample.name제대로 설정되어 있습니다. 이것이 좋은 방법입니까? 그렇지 않다면 더 좋은 방법이 있습니까? 그리고 그것을하는 방법?


이것은 해결되지 않습니다. 객체 생성 전에 정적 변수를 사용하는 경우. 예) 정적 변수가 정적 블록에서 리소스를 구성하는 데 사용되면 리소스는 null로 구성됩니다.
Kanagavelu Sugumar 2011

답변:


115

우선 public staticfinal필드는 악하다 . Spring은 이유 때문에 그러한 필드에 주입을 허용하지 않습니다.

귀하의 해결 방법은 , 당신도 게터 / 세터가 필요하지 않습니다, 유효 private필드가 충분하다. 반면에 이것을 시도하십시오.

@Value("${my.name}")
public void setPrivateName(String privateName) {
    Sample.name = privateName;
}  

( @Autowired/ 와 함께 작동 @Resource). 하지만 건설적인 조언을 해보려면 : private필드 대신 필드와 게터를 사용 하여 두 번째 클래스를 만듭니다 public static.


9
"공개 정적 비 최종 필드는 악하다"에 대해 몇 가지 참고 자료를 제공해 주시겠습니까?
앤더슨

7
최종 값이 아님은 필드 값을 수정할 수 있음을 의미하며, 정적 필드의 경우 스레드 동시성 처리를 의미합니다 (일명 스택의 고통).
Xavier Portebois

@Value를 정적 블록과 함께 사용하는 방법은 무엇입니까? 친절하게 우리를 안내 ... 감사합니다, 네하

4
참고로 : 위의 코드는 정적 필드에 쓰는 인스턴스 메서드가 있으므로 Sonar / Checkstyle 위반 (그런 종류의 문제가 발생하는 경우)을 유발합니다.
Neil

현재 null 인 경우에만 값을 설정하는 정적 setter를 사용하여 최종 측면을 모방 할 수 있습니다. 따라서 필드를 한 번만 수정할 수 있습니다. (물론 비공개로 설정되었으며 getter를 사용하여 액세스합니다). Spring은 구성 단계 (XML 또는 Annotation)에서 정적 메서드를 호출 할 수 있습니다.
Walfrat 2016

0

이것은 정적 변수를로드하기위한 샘플 코드입니다.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class OnelinkConfig {
    public static int MODULE_CODE;
    public static int DEFAULT_PAGE;
    public static int DEFAULT_SIZE;

    @Autowired
    public void loadOnelinkConfig(@Value("${onelink.config.exception.module.code}") int code,
            @Value("${onelink.config.default.page}") int page, @Value("${onelink.config.default.size}") int size) {
        MODULE_CODE = code;
        DEFAULT_PAGE = page;
        DEFAULT_SIZE = size;
    }
}

-2

Spring은 @Value 주석을 찾을 때 특정 값을 채우기 위해 종속성 주입을 사용합니다. 그러나 값을 인스턴스 변수에 전달하는 대신 암시 적 setter에 전달합니다. 이 setter는 NAME_STATIC 값의 채우기를 처리합니다.

    @RestController 
//or if you want to declare some specific use of the properties file then use
//@Configuration
//@PropertySource({"classpath:application-${youeEnvironment}.properties"})
public class PropertyController {

    @Value("${name}")//not necessary
    private String name;//not necessary

    private static String NAME_STATIC;

    @Value("${name}")
    public void setNameStatic(String name){
        PropertyController.NAME_STATIC = name;
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.