RedisUtil静态工具类中引入RedisTemplate

如何在 SpringBoot 项目的静态工具类中使用 RedisTemplate

1.静态属性不能直接注入,因此利用自定义SpringContextHolder工具类的getBean方法来获取静态bean。

@Component
public class SpringContextUtil implements ApplicationContextAware {
    private static ApplicationContext applicationContext; 

    /*
     * 实现了ApplicationContextAware 接口,必须实现该方法;
     * 通过传递applicationContext参数初始化成员变量applicationContext
     */
    public void setApplicationContext(ApplicationContext applicationContext)
            throws BeansException {
        SpringContextUtil.applicationContext = applicationContext;
    }

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    @SuppressWarnings("unchecked")
    public static <T> T getBean(String name) throws BeansException {
        return (T) applicationContext.getBean(name);
    }

    public static <T> T getBean(Class<T> clazz) throws BeansException {
        return (T) applicationContext.getBean(clazz);
    }
}
  1. 编写RedisUtil 工具类(部分)
/**
 * @ClassName: RedisUtil
 * @Description: Redis工具类
 */
public class RedisUtils {

    private final static Logger log = LoggerFactory.getLogger(RedisUtils.class);
    
    @SuppressWarnings("unchecked")
    private static RedisTemplate<String, Object> redisTemplate = SpringContextUtil.getBean("redisCacheTemplate");
    
    /**
     * @param key  键
     * @param time 时间(秒),time要大于0
     * @return result
     * @Title: expire
     * @Description: 对 redis 中指定键对应的数据设置失效时间
     */
    public static Boolean expire(String key, long time) {
        Boolean result = false;
        try {
            if (StringUtils.isNotBlank(key) && time > 0) {
                result = redisTemplate.expire(key, time, TimeUnit.SECONDS);
            }
        } catch (Exception ex) {
            log.error(ex.getMessage(), ex);
        }
        return result;
    }
}

以上说明:代码中SpringContextUtil.getBean() 根据名称redisCacheTemplate获取RedisTemplate 对象。

RedisTemplate<String, Object> redisTemplate = SpringContextUtil.getBean(“redisCacheTemplate”);

redisCacheTemplate 对应下面 3 配置的 redisCacheTemplate

3.因为RedisTemplate默认使用jdkSerializable序列化方式,需要手动指定序列化的方法。

/**
  * @Title: redisCacheTemplate
*/
@Bean
public RedisTemplate<String, Object> redisCacheTemplate(LettuceConnectionFactory factory) {  
   RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
   redisTemplate.setConnectionFactory(factory);
   Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
    // 设置 Key 和 Value 的序列化规则
   redisTemplate.setKeySerializer(new StringRedisSerializer());
   redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
   redisTemplate.setHashKeySerializer(new StringRedisSerializer());
   redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
   // 初始化 RedisTemplate 序列化完成
   redisTemplate.afterPropertiesSet();
   return redisTemplate;
}

4.当Spring的项目的某一个方法存在@PostConstruct注解时会与ApplicationContextAware冲突

  1. 原因:

@PostConstuct修饰的方法在Spring容器启动时会先于该工具类的setApplicationContext()方法运行。故这里是未运行setApplicationConext()方法初始化工具类的ApplicationContext就使用了它,所以回报空指针异常

  1. 解决办法

在启动类加上@DepondensOn(“springContextUtil”)注解

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值