zoukankan      html  css  js  c++  java
  • 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 static <T> T 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> T getBean(Class<T> 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的调用
    }

    欢迎关注作者微信公众号

  • 相关阅读:
    基于html5拖拽api实现列表的拖拽排序
    vue组件keepAlive的使用
    阿里云OSS 服务端签名后直传之分片上传(结合element-ui的upload组件)
    element-ui(vue)upload组件的http-request方法的使用
    javascript知识梳理之数据类型
    解决nginx 出现 413:Request Entity Too Large
    git基本命令
    npm源管理
    element-ui的upload组件的clearFiles方法的调用
    vue实例的生命周期
  • 原文地址:https://www.cnblogs.com/zhanqing/p/15632385.html
Copyright © 2011-2022 走看看