springboot中@ServerEndpoint和@component同时注解的类为什么每次在代码中this都是一个新的实例

问题:
为什么使用了@Component注解,还可以用this来代表不同的连接?
@Component不是单例模式吗?this不是都指向同一个地址吗?这样写真的可以吗?

上@ServerEndpoint代码:
在这里插入图片描述

来,我们直接找chatgpt问问这个问题的答案,说的模棱两可的,上图:
在这里插入图片描述
上图,感觉说的好像对,好像又不对,思来想去还是想不通,最终决定在源码debug一探究竟
经过一番摸索以后,定位到了源码中的关键三步,如下进行图文分析:
模拟一个ws连接,然后打断点
第一步,ws连接进入onopen事件断点,如图可以看到我们的endpointClass已经被找到了,就是我们对应的ScreenWebSocketServer
在这里插入图片描述
第二步,对于这个源码的onOpen方法进行简要分析查看,如下图:
在这里插入图片描述
我们点进去这个pojo = sec.getConfigurator().getEndpointInstance(sec.getEndpointClass());方法查看,如图:
在这里插入图片描述
下面就是最关键的代码调用替换,也就是我们写的代码是在这一步与源码关联上的,如图分析:
1)先记录一下调用之前,这个pojo的内存地址
在这里插入图片描述
2)进入源码的doOnOpen方法,查看并分析其主要代码结构,如下图:

在这里插入图片描述
3)下面就是关键的一步,源码中进行调用springboot容器中使用了@ServerEndPoint类的onopen方法,如果有直接调用,我们的断点也是直接跳到了我们的业务代码中

methodMapping.getOnOpen().invoke(pojo,
                        methodMapping.getOnOpenArgs(
                                pathParameters, session, config));

在这里插入图片描述
为了简要说明,我们将项目中使用了@ServerEndPoint的类统称为websocketEndPoint类(只是为了叙述方便)。

综上所述,@ServerEndPoint注解的类中代码的this指向的就是ws连接的websocketEndPoint类的全新实例,即每次ws连接就是一个新的websocketEndPoint类实例,所以this每次都指向这个新实例。
所以,这里的this与@Component的单例模式无关,可以理解@ServerEndPoint和@component同时使用时,@Component的作用就只是将这个类对应的代码托管给springboot集成的websocket,它并不是单例的,所以可以在@OnOpen,@OnClose中使用this来区分每次不同的连接
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: @component注解Spring框架一个注解,用于标识一个一个组件,可以被Spring容器管理。被标注为@Component会被自动扫描并注册到Spring容器,可以通过@Autowired注解进行自动注入。@Component注解还有几个派生注解,如@Service、@Repository和@Controller,分别用于标识服务层、持久层和控制层的组件。使用@Component注解可以方便地实现依赖注入和组件化开发。 ### 回答2: SpringBoot框架,@Component是用来声明一个一个组件的注解,被注解可以被Spring容器所管理,可以通过Spring的依赖注入机制来获取其实例。 @Component注解Spring框架注解,用于声明一个一个Bean(组件)。Spring容器会为这个创建一个实例,然后管理这个实例。被注解可以通过在需要使用的地方直接调用,而无需自己去创建实例。 @Component注解可以作用于各种型的,包括普通的Java、Controller、Service、DAO、等。SpringBoot框架支持三种组件注解:@Service、@Controller、@Repository,这三个注解Component注解的衍生注解,用于更具体的场景和约定。 在SpringBoot,组件注解一个非常重要的概念,它实现了控制反转和依赖注入的核心功能,将软件开发的各种组件统一进行了管理,提高了软件的可维护性和灵活性。 总的来说,@ComponentSpringBoot框架用来标记一个为组件的注解,被注解会被Spring容器管理,并可以通过依赖注入机制使用。通过这个注解,我们可以将一个普通的Java转化为一个Spring容器管理的Bean组件,从而实现依赖注入和控制反转的功能。 ### 回答3: 在Spring Boot框架,@Component注解是非常常见的注解之一,它用于将普通的Java标记为Spring容器的组件,使得这些能够被Spring自动扫描并加入到容器,并可被其他组件或进行调用和使用。 在大多数情况下,@Component注解可以用于标记任何Java,包括正常的POJO、服务、控制器等。在加上@Component注解后,Spring容器会自动将这些进行注册并创建相应的Bean实例。此外,@Component注解也可以与其他Spring注解一起使用,如@Profile、@Scope、@Autowired等,从而实现更加灵活和高效的组件管理。 @component注解不同于@Service、@Repository、@Controller、@RestController、@Configuration、@Bean等注解,@Service、@Repository、@Controller、@RestController是@Component的派生注解,被标记的也会被自动注册为Bean,并且在后续的Bean扫描过程被识别为特殊型的Bean,用于实现不同场景下的特殊处理。而@Configuration、@Bean注解用于对Spring容器的Bean进行自定义管理和配置。 总的来说,使用@Component注解可以简化Spring Boot项目的组件管理,提高代码的可维护性和可扩展性,同时也方便了开发者的开发和测试过程。因此,建议在Spring Boot项目尽可能多地使用@Component注解

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值