WebSocket获取Bean 【SpringBoot篇-2】
SpringBoot+WebSocket对每个客户端连接都会创建一个WebSocketServer(@ServerEndpoint注解对应的)对象,Bean的注入操作会被直接略过,因而手动注入一个全局变量
@ServerEndpoint("/im/{userId}/{toUserId}") @RestController public class ImController { public static ChatMessageRepository chatMessageRepository; //...... }
开启WebSocket支持
/** * 开启WebSocket支持 * @author zhengkai */ @Configuration public class WebSocketConfig { /** * ServerEndpointExporter 用于扫描和注册所有携带 ServerEndPoint 注解的实例, * 若部署到外部容器 则无需提供此类。 * * @return */ @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } /** * 因 SpringBoot WebSocket 对每个客户端连接都会创建一个 WebSocketServer(@ServerEndpoint 注解对应的) 对象,
* Bean 注入操作会被直接略过,因而手动注入一个全局变量 * * @param messageService */ @Autowired public void setMessageService(ChatMessageRepository chatMessageRepository) { ImController.chatMessageRepository = chatMessageRepository; } }
获取Bean工具:SpringUtils.getBean
1. 传入String格式的类名
2. 传入.class的类
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.Component; /** * @author liuzhihao */ @Component public final class SpringUtils implements BeanFactoryPostProcessor { 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 staticT getBean(String name) throws BeansException { if(getBeanFactory()==null){ //zhengkai.blog.csdn.net System.out.println("本地调试Main模式,没有BeanFactory,忽略错误"); return null; }else{ T result = (T) getBeanFactory().getBean(name); return result; } } /** * 获取类型为requiredType的对象 * * @param name * @return * @throws org.springframework.beans.BeansException * */ public static T getBean(Class name) throws BeansException { if(getBeanFactory()==null){ //zhengkai.blog.csdn.net System.out.println("本地调试Main模式,没有BeanFactory,忽略错误"); return null; }else{ T result = (T) getBeanFactory().getBean(name); 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); } }
Example
@ServerEndpoint("/imserver/{userId}") @Component public class WebSocketServer { /** * ServerEndpoint不支持注入,可以用SpringUtils获取IOC实例 */ private StringRedisTemplate redisTemplate = SpringUtils.getBean(StringRedisTemplate.class); //....省略redisTemplate的调用 }