首页 > 其他分享 >在非标准Spring组件中(比如websocket)注入Spring管理bean的方法

在非标准Spring组件中(比如websocket)注入Spring管理bean的方法

时间:2024-03-20 20:55:48浏览次数:29  
标签:UserMapper websocket Autowired Spring WebSocketServer userMapper bean 注入

private static UserMapper userMapper;
    @Autowired
    public void setUserMapper(UserMapper userMapper) {
        WebSocketServer.userMapper = userMapper;
    }

WebSocketServer是通过Java WebSocket API创建的,并且由于@ServerEndpoint不是Spring的标准组件注解,直接在其中使用@Autowired进行依赖注入通常是行不通的。这就需要采用一种特殊的方式来实现依赖注入。

private static UserMapper userMapper;:这是对UserMapper的静态声明。UserMapper是一个接口,通过MyBatis或MyBatis Plus等ORM框架与数据库进行交互的Mapper。由于WebSocketServer实例可能会有多个,而UserMapper应该是一个全局单例(与数据库的交互通常是线程安全的,且不需要每个WebSocket连接都创建一个新的实例),因此这里使用static修饰符。

(ORM框架:允许开发者在编程时使用面向对象的方式来操作数据库中的数据,而不是通过直接编写SQL语句。ORM框架会负责将面向对象的操作转换为适当的数据库操作。)

@Autowired:这是Spring的注解,用于自动注入依赖。但是由于WebSocketServer类的实例化不是由Spring控制的,因此不能直接在类的字段上使用@Autowired进行自动注入。

public void setUserMapper(UserMapper userMapper) { ... }:这个方法是一个通过@Autowired注解的setter方法。Spring会自动调用这个方法并传入一个UserMapper的实例,这样即使在非标准的Spring组件中也能实现依赖注入。这里通过传递的userMapper参数来设置静态字段userMapper的值。

解决方案

为了在WebSocketServer这样的类中注入Spring管理的bean,解决方案是创建一个非静态的setter方法,并在这个方法上使用@Autowired注解。Spring在启动时会自动调用这个方法,并注入所需的依赖。然后,这个方法内部再将注入的依赖赋值给静态变量,这样即便是WebSocket的生命周期管理不由Spring控制,我们也能在类中使用由Spring管理的依赖。

注意事项

使用静态字段持有Spring管理的bean是一种特殊情况下的解决方案,通常不推荐这样做,因为它违背了Spring的依赖注入原则,可能会导致代码难以测试和维护。不过,在某些特殊场景(如此处的WebSocket服务端实现)下,这种方式可以作为一种权宜之计。

标签:UserMapper,websocket,Autowired,Spring,WebSocketServer,userMapper,bean,注入
From: https://www.cnblogs.com/rdisheng/p/18086064

相关文章

  • Spring三级缓存及循环依赖的解决
    三级缓存的概念是针对单例bean来说的,原型的bean是每次直接创建新的bean对象,IoC容器中,同一个bean或者其代理对象只能存在一个,不能同时存在 一级缓存存放完整的bean(实例化和初始化都已完成)二级缓存提前曝光的不完整的bean(可能是bean,也可能是bean的AOP代理,未进行初始化) 作用......
  • spring使用jdk17运行出现编码问题
    遇到一个比较奇怪的问题。这个问题别人也遇到过。https://blog.csdn.net/gao_chuan_g/article/details/115117712一、情况简介使用jdk17+springboot3.x+spring6.x写一个小应用A,其中有一部分代码是用于生成SM2加密后的字符串,这个字符串会再做一些处理,最终会显示在前端的页面。......
  • Spring boot2.7整合jetcache方法缓存 处理数据发生变化时同步更新缓存 删除缓存操作
    上文Springboot2.7整合jetcache方法缓存我们做了个方法缓存的案例可以将接口内容缓存起来是能大大提高效率的但是我们接口的数据大多来自数据库如果我们调用增删查改它的数据变化了那缓存的内容就会因为没有及时更新变的不准确例如我们这样我们在上面定义了......
  • Spring boot2.7整合jetcache方法缓存
    前面的文章我们讲了springboot整合jetcache做基本字符串数据缓存但是我这里有个这样的逻辑我的domain包下有一个book属性类里面就id和name属性设置了对应的setget函数和一个整体的构造函数packagecom.example.javadom.domain;publicclassboo......
  • 【数据脱敏方案】不使用 AOP + 注解,使用 SpringBoot+YAML 实现
    文章目录引入认识YAML格式规范定义脱敏规则格式脱敏逻辑实现读取YAML配置文件获取脱敏规则通过键路径获取对应字段规则原始优化后对数据进行脱敏处理递归生成字段对应的键路径脱敏测试完整工具类引入在项目中遇到一个需求,需要对交易接口返回结果中的指定字段......
  • 1、【AI技术新纪元:Spring AI解码】Spring AI 应用框架
    SpringAI应用框架SpringAI是面向人工智能工程的应用框架。其目标是将Spring生态系统的设计原则如可移植性和模块化设计应用于AI领域,并推广使用POJOs(PlainOldJavaObjects,简单旧式Java对象)作为应用程序的构建块。特点跨AI提供商的可移植API支持,涵盖聊天、文本到图像......
  • springboot-Swagger
    Swagger简介前后端分离Vue+SpringBoot后端时代:前端只用管理静态页面:html==>后端。。模版引擎JSP=>后端是主力前后端分离后端:后端控制层,服务层,数据访问层【后端团队】前端:前端控制层,视图层【前端团队】Swagger号称世界上最流行的API框架RestfulApi文档在线自动生成......
  • Spring入门案例
    一、下载Spring5jar包官网地址:https://spring.io/版本目录:https://spring.io/projects/spring-framework#learn下载地址:https://repo.spring.io/ui/native/release/org/springframework/spring/二、新建java工程2.1新建项目2.2导入jar包必需的jar包2.2.1新建lib......
  • Springboot笔记-05
    1.Springboot的热部署spring为开发者提供了一个名为spring-boot-devtools的模块来使SpringBoot应用支持热部署,提高开发者的开发效率,无需手动重启SpringBoot应用。在pom文件加入依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-b......
  • SpringBoot整合Mybatis(SpringBoot3)
    依赖pom.xml:pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://......