ApplicationContext?SpringBoot中静态方法如何引用非静态对象?

       最近在项目开发中遇到了一个问题:在SpringBoot项目中静态方法的上下文如何引用非静态的对象?

       先来说项目中的需求:项目中要开发一个工具类用于调用远端网关的Http接口,

在调用网关接口之前需要先获取一个Token令牌(我们项目中获取Token令牌的方式是由进程去请求、检查、更新令牌,然后将有效的令牌存在Redis缓存中)。成功的获取到Token之后再拿着有效的Token去请求远端的网关Http接口。而问题就出在了我如何成功的从Redis中获取Token。

       作为SpringBoot项目去获取Redis中的内容,最先想到的肯定就是采用@Autowired注解引入StringRedisTemplate类,然后调用redisTemplate.opsForValue().get(“Redis缓存的key”)方法。

       但是我是一个调用Http接口的工具类里边的静态方法,按照Java的特性静态方法不能引用非静态对象和变量,这时候有人可能想到了用下图的方式引入StringRedisTemplate

ApplicationContext?SpringBoot中静态方法如何引用非静态对象?

      但是很遗憾的告诉你,由于Java类加载的特性,这样引用的对象并不会被Spring的Bean容器管理。那么我们到底该怎么解决呢?

      网上查询,提到了一个关键点 接口:ApplicationContext 再去翻源码,最终找到了本公司自己内部封装的一个类:SpringBootContextHelper(公司内部的代码不方便展示),采用这种方式即可从Spring的Bean容器中获取到StringRedisTemplate对象,方法如下:

SpringBootContextHelper.getApplicationContext().getBean(StringRedisTemplate.class);

扩展:

       对于另一种获取ApplicationContext的方式。我们可以采用以下方式,并对获取方式进行一个小小的封装,封成一个工具类,如下:

ApplicationContext?SpringBoot中静态方法如何引用非静态对象?

此时在代码中的使用即变为:

ApplicationContext?SpringBoot中静态方法如何引用非静态对象?

运行结果:成功的获取到StringRedisTemplate对象

ApplicationContext?SpringBoot中静态方法如何引用非静态对象?