SpringBoot(十三)SpringBoot配置webSocket

server/2024/11/14 2:27:57/

在PHP版本的博客中,我使用PHP+swoole实现了webscoket即时聊天的功能。

在java版本的博客中,我也想使用webscoket来实现即时聊天的功能,下边是我实现过程的一个记录。

一:在pom.xml中添加记录

<!-- spring-websocket start -->
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-websocket</artifactId>
 </dependency>
 <!-- spring-websocket end -->

二:在config目录添加WebSocketConfig.java文件

package com.springbootblog.config;
 
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.web.socket.config.annotation.EnableWebSocket;
 import org.springframework.web.socket.server.standard.ServerEndpointExporter;
 /**
  * @ Description: 开启WebSocket支持
  */
 @Configuration
 @EnableWebSocket
 public class WebSocketConfig
 {
     @Bean
     public ServerEndpointExporter serverEndpointExporter() {
         return new ServerEndpointExporter();
     }
 }

三:解决@ServerEndpoint注解中的@Autowired注解失效的问题

原理是WebSocket是线程安全的,有用户连接时就会创建一个新的端点实例,一个端WebSocket是多对象的,使用的spring却是单例模式。这两者刚好冲突。

所以在@ServerEndpoint注解下不能使用Autowired注解注入对象,那我在webscoket的控制器中也是需要操作redis以及操作数据库的,那我该如何去处理这个问题呢?

我百思不得其解。最后在百度上一位大神的指点下解决了这个问题。

使用从容器中取对象的工具类

在utils目录中添加SpringUtil.java文件

package com.springbootblog.utils;
 
 import org.springframework.beans.BeansException;
 import org.springframework.context.ApplicationContext;
 import org.springframework.context.ApplicationContextAware;
 import org.springframework.stereotype.Component;
 
 @Component
 public class SpringUtil implements ApplicationContextAware
 {
     private static ApplicationContext applicationContext;
 
     @Override
     public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
         SpringUtil.applicationContext = applicationContext;
     }
 
     public ApplicationContext getApplicationContext(){
         return applicationContext;
     }
 
     public static Object getBean(String beanName){
         return applicationContext.getBean(beanName);
     }
 
     public static <T> T getBean(Class<T> clazz){
         try
         {
             return (T)applicationContext.getBean(clazz);
         }
         catch(Exception e)
         {
             return null;
         }
     }
 }

四:在SpringBoot中使用webscoket

package com.springbootblog.controller.fontend;
 
 import com.alibaba.fastjson.JSONObject;
 import com.springbootblog.dao.ChatRecordDao;
 import com.springbootblog.dao.UserDao;
 i

http://www.ppmy.cn/server/141370.html

相关文章

C语言中,“extern”关键字的含义与用法

在C语言中&#xff0c;extern 关键字用于声明一个已经在其他地方定义的变量或函数。它的主要作用是告诉编译器&#xff0c;某个变量或函数是在当前文件之外定义的&#xff0c;编译器应该在链接阶段找到这个变量或函数的实际定义。以下是 extern 的一些常见用途和用法&#xff1…

c语言中联合Union的作用及示例代码说明

引言 在C语言中&#xff0c;联合&#xff08;Union&#xff09;是一种特殊的数据结构&#xff0c;它允许在相同的内存位置存储不同的数据类型。其它语言中没有类似的语法。 以下是联合的一些作用以及相应的例子。 作用 1 节省空间 联合可以用来节省内存&#xff0c;因为它允…

关于Redis

Redis 基础 什么是 Redis&#xff1f; Redis &#xff08;REmote DIctionary Server&#xff09;是一个基于 C 语言开发的开源 NoSQL 数据库&#xff08;BSD 许可&#xff09;。与传统数据库不同的是&#xff0c;Redis 的数据是保存在内存中的&#xff08;内存数据库&#xf…

原创:使用Qt Creator作为Linux IDE,实现CMake编译和gdb单步调试

1.前期简单步骤参考http://blog.csdn.net/libaineu2004/article/details/78448392 2.Linux下CMake简明教程 http://原文地址&#xff1a;https://blog.csdn.net/whahu1989/article/details/82078563 CMake是开源、跨平台的构建工具&#xff0c;可以让我们通过编写简单的配置…

如何在CentOS 7上搭建SMB服务

如何在CentOS 7上搭建SMB服务 因项目测试需求&#xff0c;需要自行搭建SMB服务&#xff0c;**SMB&#xff08;Server Message Block&#xff09;**协议是一种常用的文件共享方式&#xff0c;它可以让不同操作系统之间共享文件、打印机等资源。本文将带你一步步搭建一个简单的S…

Kafka-Eagle的配置——kafka可视化界面

通过百度网盘分享的文件&#xff1a;kafka-eagle-bin-2.0.8.tar.gz 链接&#xff1a;https://pan.baidu.com/s/1H3YONkL97uXbLTPMZHrfdg?pwdsltu 提取码&#xff1a;sltu 一、界面展示 二、软件配置 1、关闭kafka集群 kf.sh stop 2、将该软件上传到/opt/modules下 cd /opt…

MySQL 到 ClickHouse 数据同步优化(三)

简述 本文主要介绍 CloudCanal 如何将关系型数据库中数据同步到 ClickHouse&#xff0c;默认使用 ReplacingMergeTree 作为 ClickHouse 表引擎&#xff0c;链路特点包括&#xff1a; 新增 _version、_sign 字段&#xff0c;以便 ClickHouse 准确合并。DML 操作均以 INSERT 写…

esayExcel根据模板导出包含图片

1、效果 2、模板 3、工具类代码 /*** 根据模板填充* param response* param templateStream 模板文件流* param map 模板文件所需要的参数* param list list循环模板参数* throws IOException*/public static void templateFilling(HttpServletRequest servletRequest,HttpServ…