spring boot 集成 websocket 实现消息互动,参考
https://www.cnblogs.com/leigepython/p/11058902.html
@Autowire
private StringRedisTemplate StringRedisTemplate;
发现注入不了redis,redis注入失败 可能是因为实例化的先后顺序吧,WebSocket先实例化了, 但是@Autowire是会触发getBean操作的,可能用的是@Bean的原因吧, 还是个问题
1:通过sping上下文的容器来取得:
2:配置多个redis的实例
package com.config;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.jedis.JedisClientConfiguration;
import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration;
import org.springframework.data.redis.core.RedisOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.support.collections.RedisProperties;
import java.net.UnknownHostException;
/**
*
**/
@Configuration
@ConditionalOnClass(RedisOperations.class)
//@EnableConfigurationProperties(RedisProperties.class)
//@Import({LettuceClientConfiguration.class, JedisClientConfiguration.class})
public class RedisAutoConfiguration {
@Bean
@ConditionalOnMissingBean(name = "redisTemplate")
public RedisTemplate<Object, Object> redisTemplate(
RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
@Bean
@ConditionalOnMissingBean
public StringRedisTemplate stringRedisTemplate(
RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}
3:上下文工具类
package com.abao.utils;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.stereotype.Repository;
/**
**/
@Repository
public class SpringUtils implements BeanFactoryPostProcessor {
//Spring应用上下文环境
private static ConfigurableListableBeanFactory beanFactory;
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
SpringUtils.beanFactory = beanFactory;
}
public static ConfigurableListableBeanFactory getBeanFactory() {
return beanFactory;
}
/**
* 获取对象
*
* @param name
* @return Object 一个以所给名字注册的bean的实例
* @throws org.springframework.beans.BeansException
*
*/
@SuppressWarnings("unchecked")
public static <T> T getBean(String name) throws BeansException {
return (T) getBeanFactory().getBean(name);
}
/**
* 获取类型为requiredType的对象
*
* @param clz
* @return
* @throws org.springframework.beans.BeansException
*
*/
public static <T> T getBean(Class<T> clz) throws BeansException {
T result = (T) getBeanFactory().getBean(clz);
return result;
}
/**
* 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true
*
* @param name
* @return boolean
*/
public static boolean containsBean(String name) {
return getBeanFactory().containsBean(name);
}
/**
* 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)
*
* @param name
* @return boolean
* @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
*
*/
public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
return getBeanFactory().isSingleton(name);
}
/**
* @param name
* @return Class 注册对象的类型
* @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
*
*/
public static Class<?> getType(String name) throws NoSuchBeanDefinitionException {
return getBeanFactory().getType(name);
}
/**
* 如果给定的bean名字在bean定义中有别名,则返回这些别名
*
* @param name
* @return
* @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
*
*/
public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {
return getBeanFactory().getAliases(name);
}
}
4:redis 工具类
package com.utils;
import com.alibaba.fastjson.JSON;
import org.springframework.data.redis.core.StringRedisTemplate;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
**/
public class RedisTools {
public static <T> List<T> hget(StringRedisTemplate stringRedisTemplate,String key,Class<T> clazz){
List<Object> list = stringRedisTemplate.opsForHash().values(key);
return JSON.parseArray(list.toString(), clazz);
}
public static <T> T hget(StringRedisTemplate stringRedisTemplate,String h,String key,Class<T> clazz){
Object o = stringRedisTemplate.opsForHash().get(h,key);
return JSON.parseObject(o.toString(), clazz);
}
public static void hset(StringRedisTemplate stringRedisTemplate,String h,String key,String value){
stringRedisTemplate.opsForHash().put(h,key,value);
}
public static void expire(StringRedisTemplate stringRedisTemplate,String key,Integer time){
stringRedisTemplate.expire(key,time, TimeUnit.SECONDS);
}
public static Boolean existsHash(StringRedisTemplate stringRedisTemplate,String h,String key){
return stringRedisTemplate.opsForHash().hasKey(h,key);
}
public static Boolean existsValue(StringRedisTemplate stringRedisTemplate,String key){
return stringRedisTemplate.hasKey(key);
}
public static Long hdel(StringRedisTemplate stringRedisTemplate,String h,String key){
return stringRedisTemplate.opsForHash().delete(h,key);
}
public static void set(StringRedisTemplate stringRedisTemplate,String key,String value){
stringRedisTemplate.opsForValue().set(key,value);
expire(stringRedisTemplate,key,60*60);
}
public static <T> T get(StringRedisTemplate stringRedisTemplate,String key,Class<T> clazz){
Object object = stringRedisTemplate.opsForValue().get(key);
return JSON.parseObject(object.toString(), clazz);
}
public static Object get(StringRedisTemplate stringRedisTemplate,String key){
Object object = stringRedisTemplate.opsForValue().get(key);
return object;
}
}