springboot集成websocket调用Service

本文介绍了在SpringBoot中使用WebSocket时,如何避免因直接在WebSocket类中@Autowired注入Service或Mapper导致的bean未找到错误。通过Spring提供的AutowireCapableBeanFactory进行手动注入,解决了该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

springboot集成websocket,如果需要在websocket类中调用service或者mapper方法, 直接在websocket类中用@autowired来注入依赖是会报无法找到bean类的错误,下面就是错误的示例:

@Service
@ServerEndpoint("/api/ws")
public class WebSocketServer {

	private Session session;
	
    @Autowired
    ItemMapper itemMapper;
    
	@OnOpen
    public void onOpen(Session session) {
    	this.session = session;
    	Item item = itemMapper.getItem();
    }

为解决这个问题,可以使用 Spring 提供的 AutowireCapableBeanFactory 来手动注入依赖。首先,我们在springboot的启动类注入 AutowireCapableBeanFactory 实例,如下:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class YourApplication {
    
    @Autowired
    private ApplicationContext applicationContext;
    
    @Bean
    public AutowireCapableBeanFactory autowireCapableBeanFactory() {
        return applicationContext.getAutowireCapableBeanFactory();
    }
    
    public static void main(String[] args) {
        SpringApplication.run(YourApplication.class, args);
    }
}

然后在 WebSocket 实现类中使用 AutowireCapableBeanFactory 完成手动注入。

@Service
@ServerEndpoint("/api/ws")
public class WebSocketServer {

	private Session session;
	
    ItemMapper itemMapper;
    
    private static AutowireCapableBeanFactory beanFactory;

    @Autowired
    public void setBeanFactory(AutowireCapableBeanFactory beanFactory) {
        WebSocketServer.beanFactory = beanFactory;
    }
    
	@OnOpen
    public void onOpen(Session session) {
    	this.session = session;
    	this.itemMapper = beanFactory.getBean(ItemMapper.class);
    	Item item = itemMapper.getItem();
    }

这样调用service或者mapper就不会报错了.

### Spring Boot WebSocket 集成 Redis 的实现方案 在实际开发中,Spring Boot 提供了强大的支持来集成 WebSocket 和 Redis。以下是关于如何在一个 Spring Boot 项目中通过 WebSocket 调用 Redis 服务的具体实现方法。 #### 1. 添加依赖项 为了使 Spring Boot 支持 WebSocket 和 Redis 功能,在 `pom.xml` 文件中需引入必要的依赖库: ```xml <dependencies> <!-- Spring Boot Starter Websocket --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> <!-- Spring Data Redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- Lettuce or Jedis (choose one) --> <dependency> <groupId>io.lettuce.core</groupId> <artifactId>lettuce-core</artifactId> </dependency> </dependencies> ``` 以上配置包含了 WebSocket 和 Redis 所需的核心组件[^1]。 --- #### 2. 配置 Redis 连接 创建一个用于连接 Redis 的配置类,定义 RedisTemplate 并设置序列化方式以便于数据存储和读取操作。 ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.listener.ChannelTopic; import org.springframework.data.redis.listener.adapter.MessageListenerAdapter; import org.springframework.data.redis.serializer.StringRedisSerializer; @Configuration public class RedisConfig { @Bean public StringRedisSerializer stringRedisSerializer() { return new StringRedisSerializer(); } @Bean ChannelTopic topic() { return new ChannelTopic("chat"); } } ``` 此部分代码实现了对 Redis 数据的操作以及消息监听器的初始化工作[^2]。 --- #### 3. 实现 WebSocket 配置 接下来需要编写一个 WebSocket 配置文件以启用 STOMP 协议并注册端点路径 `/ws` 来处理客户端请求。 ```java import org.springframework.context.annotation.Configuration; import org.springframework.messaging.simp.config.MessageBrokerRegistry; import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; import org.springframework.web.socket.config.annotation.StompEndpointRegistry; import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { @Override public void configureMessageBroker(MessageBrokerRegistry config) { config.enableSimpleBroker("/topic"); // 定义广播前缀 config.setApplicationDestinationPrefixes("/app"); // 设置应用级目标前缀 } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/ws").withSockJS(); // 注册 SockJS 端点 } } ``` 上述代码片段展示了如何利用 STOMP 协议扩展标准 WebSocket API,并允许更复杂的通信模式。 --- #### 4. 创建控制器逻辑 最后一步是在 Controller 中完成业务逻辑编码,当收到新消息时将其转发给订阅者或者保存到 Redis 缓存里。 ```java @Controller public class ChatController { private final SimpMessagingTemplate template; @Autowired public ChatController(SimpMessagingTemplate template){ this.template = template; } @MessageMapping("/send/message") public void sendMessage(@Payload Message message, Principal principal) throws Exception{ System.out.println(principal.getName()+" sent "+message.getContent()); // 将消息发送至所有已订阅用户 template.convertAndSend("/topic/messages",new Response(message)); // 同步更新 Redis 数据库中的记录副本 redisTemplate.opsForValue().set("last_message:"+principal.getName(),message); } } ``` 这里不仅完成了向在线用户的实时推送功能,还同步维护了一份最新的聊天历史缓存在内存型数据库——即 Redis 当中[^3]。 --- ### 总结 综上所述,本文介绍了基于 Spring Boot 构建的应用程序怎样借助 WebSocket 技术实现实时通讯的同时结合 Redis 存储机制优化性能表现的方法论。这种方法特别适合构建诸如即时通讯工具之类的高并发场景下的互联网产品原型设计阶段快速验证需求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值