专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

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

问题由来:

公司有个项目用到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容器中,相当于配置文件中的。泛指各种组件,比如类不属于@Controller或者@Service等时,就可以用该注解标注;

@PostConstruct这个注解是我第一次接触,在方法上加该注解会在项目启动的时候执行该方法,即spring容器初始化的时候执行,它与构造函数及@Autowired的执行顺序为:构造函数 >> @Autowired >> @PostConstruct,由此看来当我们想在生成对象时完成某些初始化操作,而偏偏这些初始化操作又依赖于注入的bean,那么就无法在构造函数中实现,为此可以使用@PostConstruct注解一个init方法来完成初始化,该方法会在bean注入完成后被自动调用。

解决方案:

最终实现代码如下红色字体

public class WebSocketServerHandler extends SimpleChannelInboundHandler<Object> {

    @Autowired
    private JedisClient jedisClient;

    private static WebSocketServerHandler webSocketServerHandler;

    @PostConstruct
    public void init() {
        webSocketServerHandler = this;
    }

   ...此处省略其余代码...

    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        webSocketServerHandler.jedisClient.get(...);
    }
}

参数文章:

1、https://blog.csdn.net/u012138272/article/details/80502684

2、https://blog.csdn.net/qq_39851704/article/details/80392867

文章永久链接:https://tech.souyunku.com/22359

未经允许不得转载:搜云库技术团队 » Netty handler处理类无法使用@Autowired注入bean的解决方法

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们