spring中如何优雅地给工具类静态字段注入值

写了个工具类,想能自动从.yml文件中读取值赋给静态成员变量,但@Value跟@Autowired都是面向实例的东西,我禁掉实例化之后就不起作用了

public class JwtTokenUtil {

    public static final String CLAIM_KEY_CREATED = "created";

    private static final Logger LOGGER = LoggerFactory.getLogger(JwtTokenUtil.class);

    //@Value("${xx.xx}")失效
    private static String secret;
    private static Long expiration;

    private JwtTokenUtil() {
        //禁实例化
    }

}

网上找了一些,也和朋友们讨论了一下,大概有这么几类方式达成目的:

  1. 保底解决方案,把配置文件中的值写到工具类里面
  2. setter方法给静态字段赋值,加上@Component从而使@Value生效
  3. @PostConstructor注解在加载类之后插入自定义的逻辑
  4. 引入Environment或者ApplicationContext从而获取其读取的配置

第一种不作分析了,直接

private static Long expiration = 60*60;

问题解决,但不满足“从配置文件中读取”的要求。

第二种。setter赋值外,还有其它一些方式,但由于需要使用@Component,需要搞出来一个实例Bean才行

第三种,个人感觉相较而言更合适一些的方案,但是这种方式问题在于

以前使用的静态注入的方法都是通过@PostConstruct来实现的。

方法可行,也挺方法,但是有一个问题就是会报sonar。

因为调用类的实例方法去给静态常量赋值是不允许的。

    ——from 血液里的烈马

第四种来自春涛大佬的开源项目,需要在容器refresh前拿到environment,然后就可以调用对应方法去赋值了

 

感觉这些互有优劣,我也拿不准哪个更倾向于最佳答案,抛砖引玉,欢迎评论区一起讨论

 

你可能感兴趣的:(spring)