이 수업으로
@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 static
논 final
필드는 악하다 . 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;
}
}