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的调用
    }

    欢迎关注作者微信公众号

  • 相关阅读:
    Javascript FP-ramdajs
    微信小程序开发
    SPA for HTML5
    One Liners to Impress Your Friends
    Sass (Syntactically Awesome StyleSheets)
    iOS App Icon Template 5.0
    React Native Life Cycle and Communication
    Meteor framework
    RESTful Mongodb
    Server-sent Events
  • 原文地址:https://www.cnblogs.com/zhanqing/p/15632385.html
Copyright © 2011-2022 走看看