最近在工作中,看到了一个注解,使用非常频繁.@Value这个注解也算是常用注解吧!查阅了一下,并记录下来.
@Value的几种用法.
@Value(#{SpEL表达式})
这里面的SpEL表达式可以表示常量,可以表示表达式,也可以表示某个bean对象的属性.
@RestController
public class LoginController {
@Value("#{1}")
private int number; //获取数字 1
@Value("#{'Spring Expression Language'}") //获取字符串常量
private String str;
@Value("#{dataSource.url}") //获取bean的属性
private String jdbcUrl;
@Autowired
private DataSourceTransactionManager transactionManager;
public static void main(String[] args) {
System.out.println(number);
System.out.println(str);
System.out.println(jdbcUrl);
}
}
@Value(${})
这个注解是获取配置文件里的值,通常情况下变量定义在application.Properties或application.yml里面
//applicetion.Properties定义变量的方法
user.name = wang
//application.yml定义变量的方法
user
name: wang
//获取方式放在方法上
@Value(${user.name})
public void getList(String name){
System.out.println(namne);
}
-----------------------------------------------------------------------------------
//放在变量上
@Value(${user.name})
private String name;
注意事项(赋不上值)
在最近使用过程中发现我获取不到配置文件里面的值
下面是我的配置文件application.properties
jwt.key = "DoubleKill"
下面是附不上值的代码(这些代码是精简版主要是说明问题.)
这里面的代码我简单介绍一下,以便更好的理解问题.
我想写一个工具类加一个静态方法.其中SECRET_KEY需要从配置文件里获取值.
注意这是错误代码
@Slf4j
public class JwtUntil {
//获取配置配置文件中的key值
@Value("${jwt.key}")
private static String SECRET_KEY;
//解析token
public static Claims getTokenInfo(String token,String key){
Claims claims = Jwts.parser().setSigningKey(key).parseClaimsJws(token).getBody();
return claims;
}
}
上述代码错误原因在于@Value的使用方法:
不能使用static或final修饰变量
类上必须加@Component(换句话说类必须在容器里)
使用对象时必须是从容器中获取的(换句话说就是必须@autowired获取对象)
这三点做到了基本上就可以获取到值了.
上述代码问题处理
上面说了我想写一个静态方法,但是如果以上面的规则,我就不能声明静态变量,不声明静态变量就不能再静态方法里面使用其变量.所以我们可以这么做来解决这个问题
@Slf4j
@Component
public class JwtUntil {
//获取配置配置文件中的key值
private static String SECRET_KEY;
private static final String CLAIM_KEY_USER_ID = "sub";
private static final String CLAIM_KEY_CREATED = "created";
/**
* 这个位置要注意下:
* 为什么要写这个方法?
* 我们下面如果想写一个静态方法的工具类,这个方法里面只能用静态变量
* 这里我们想通过@Value获取到配置文件里面秘钥变量.但是@Value的限制是:
* 如果是final、static修饰的变量获取不到值,并且这个类必须在容器里面(@Component修饰的类)
* 所以我们只能使用set方法初始化这个值.
* 而且这里面要注意一点@Value标注在方法和变量上会在程序启动时进行赋值或是调用该方法.
*/
//初试化配置文件里面的秘钥
@Value("${jwt.key}")
public void setSecretKey(String secretKey) {
SECRET_KEY = secretKey;
}
//获取配置文件中的秘钥
public static String generateToken(SysUser sysUser){
Map<String,Object> claims = new HashMap<String, Object>();
//在jwt中标准声明
claims.put(CLAIM_KEY_USER_ID, sysUser.getId());
//这里面一个问题->如果存时间,Token解析返回来的应该是毫秒,想要计算成时间需要另行处理.
claims.put(CLAIM_KEY_CREATED,new Date());
//开会创建token
JwtBuilder jwtBuilder = Jwts.builder()
.setClaims(claims)
.signWith(SignatureAlgorithm.HS512,SECRET_KEY);
return jwtBuilder.compact();
}
//解析token
public static Claims getTokenInfo(String token,String key){
Claims claims = Jwts.parser().setSigningKey(key).parseClaimsJws(token).getBody();
return claims;
}
}
我们可以使用set方法来设置变量值.这样就可以保证变量是静态的,另外提一下@Value执行赋值是在程序启动的时候
坚持学习虚心交流--------Int_Xu