@Value注释如是说: 做为Spring的两个常见注释,其促进作用是透过注释将自变量、命令行中的值和其它bean的特性值转化成到表达式中,做为表达式的常量。
@Value(“${login.name}”)
private String loginName;
@value无法间接转化成值给动态表达式
@Value(“${login.name}”)
private static String loginName;
在Java中,动态表达式也称作类表达式。换句话说,它归属于两个类,而并非两个某一的示例。因而,类调用的这时候也将调用动态表达式恰好相反,类的示例 调用的这时候也将调用 示例表达式(非动态表达式)。类的大部份示例共享资源此类的动态表达式。
@value 是在 bean示例化时,在特性充填操作过程中展开表达式的,static调用要早在@value。
前述情景中,自变量须要透过命令行来实用性,该咋办?
第一种形式:
把@Value(value=”${local.file.temp.dir}”)放在动态表达式的set形式下面方可,须要特别注意的是set形式要拿掉static,除了是现阶段类要交予spring来管理
/**文档储存产品目录*/
public static String SAVE_PATH;
//提过拿掉static
@Value(“${local.file.temp.dir}”)
public void setSavePath(String savePath){
SAVE_PATH = savePath;
}
命令行:
local:
file:
temp:
dir : /data/temp
第四种形式:
采用 @postconstruct
/**文档储存目录*/
public static String SAVE_PATH;
@Value(“${local.file.temp.dir}”)
public String SAVE_PATH_TEMP;
@PostConstruct
private void init(){
SAVE_PATH = SAVE_PATH_TEMP;
}
@GetMapping(“test”)
public void test(){
System.out.println(SAVE_PATH);
}
@PostConstruct 是在 bean 调用(initializeBean)操作过程中调用的,是在@value之后调用的,可以透过这种形式给动态表达式表达式。
第四种形式:
同时实现InitializingBean 接口
public class IndexController implements InitializingBean {
/**文档储存产品目录*/
public static String SAVE_PATH;
@Value(“${local.file.temp.dir}”)
public String SAVE_PATH_TEMP;
@GetMapping(“test”)
public void test(){
System.out.println(SAVE_PATH);
}
@Override
public void afterPropertiesSet() throws Exception {
SAVE_PATH = SAVE_PATH_TEMP;
}
}
InitializingBean 接口也是在bean调用(initializeBean)操作过程中调用的,具体可以看下spring bean 的示例化操作过程。
采用 @value 注释读取命令行给动态表达式表达式的形式给大家如是说到这里,希望对大家有所帮助。