Spring中的注解@Value,及其附不上值问题处理

最近在工作中,看到了一个注解,使用非常频繁.@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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值