Netty handler处理类无法使用@Autowired注入bean的解决方法

在Netty作为websocket实现的项目中,遇到在ChannelHandler中@Autowired的JedisClient对象为null的问题。经过排查,确认是因为WebSocketServerHandler由netty创建而非Spring管理。解决方案是使用@Component和@PostConstruct注解,使handler成为Spring容器的一部分,并在初始化时完成依赖bean的注入。

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

问题由来:

公司有个项目用到netty作为websocket的实现,最近打算部署双机,这使得原来在内存中的保存Channel信息的方案不再可行,需要转移到redis中,改造过程中发现通过@Autowired注入进来的JedisClient类无法使用,外部表现为jedisClient对象为null

解决过程:

1.一开始以为是spring配置引入先后顺序的问题,导致netty启动的时候jedisClient还没实例化好,调整后发现问题依旧

2.之后百度发现有不少人遇到这个问题,有回答说netty中无法使用注入的bean,需要主动通过getBean的方式来获取,这下问题基本上已经确定了,并不是配置的问题,而是因为WebSocketServerHandler是netty启动的时候new出来,并没有交给spring IOC托管

3.发现问题根源后找解决方法就很明朗了,最终的解决方法需要用到spring的两个注解@Component@PostConstruct

@Component大家都能熟悉了,就是把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class="">。泛指各种组件,比如类不属于@Controller或者@Service等时,就可以用该注解标注;

@PostConstruct这个注解是我第一次接触,在方法上加该

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值