如何在 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);
}
}
- 编写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冲突
- 原因:
@PostConstuct修饰的方法在Spring容器启动时会先于该工具类的setApplicationContext()方法运行。故这里是未运行setApplicationConext()方法初始化工具类的ApplicationContext就使用了它,所以回报空指针异常
- 解决办法:
在启动类加上@DepondensOn(“springContextUtil”)注解