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

이 수업으로

@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제대로 설정되어 있습니다. 이것이 좋은 방법입니까? 그렇지 않다면 더 좋은 방법이 있습니까? 그리고 그것을하는 방법?



답변

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

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

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

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


답변

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

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


답변

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


답변