项目实践-通信程序

技术:

SpringBoot + Mybatis + WebSocket

前端

技术难点

遗忘知识

问题

@Autowired装载失败

@ServerEndpoint(value = "/websocket",configurator = GetHttpSessionConfigurator.class)
@Component
public class WebSockTest {
    //数据库
    @Autowired
    UserIn  userIn;

springboot启动时,发现 userIn为null,

  • 问题:spring管理的都是单例(singleton),和 websocket (多对象)相冲突。

  • 详细解释:项目启动时初始化,会初始化 websocket (非用户连接的),spring 同时会为其注入 service,该对象的 service 不是 null,被成功注入。但是,由于 spring 默认管理的是单例,所以只会注入一次 service。当客户端与服务器端进行连接时,服务器端又会创建一个新的 websocket 对象,这时问题出现了:spring 管理的都是单例,不会给第二个 websocket 对象注入 service,所以导致只要是用户连接创建的 websocket 对象,都不能再注入了。

    @ServerEndpoint(value = "/websocket",configurator = GetHttpSessionConfigurator.class)
@Component
public class WebSockTest {
    //数据库
    //使用静态的类
    private static UserIn  userIn;

    //注入的时候,给类的service注入
    @Autowired
    public  void setUserIn(UserIn userIn) {
        WebSockTest.userIn = userIn;
    }

作用域

  • request session application
  • map是request的作用域
  • session是一次会话,会话

关于session覆盖问题

如果用户登录,当用session保存用户的id,相同浏览器登录不同账号,第二次会覆盖掉第一次用户的id,因为同一个浏览器cookie值相同,解析的session域一样,就被覆盖,

参考

@Autowired装载失败

posted @ 2022-10-30 22:20  壹剑霜寒十四州  阅读(26)  评论(0编辑  收藏  举报