zoukankan      html  css  js  c++  java
  • 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容器中,相当于配置文件中的<bean id="" class="">。泛指各种组件,比如类不属于@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

  • 相关阅读:
    PAT A1094 The Largest Generation (25 分)——树的bfs遍历
    PAT A1055 The World's Richest (25 分)——排序
    PAT A1052 Linked List Sorting (25 分)——链表,排序
    PAT A1076 Forwards on Weibo (30 分)——图的bfs
    辅导员
    辅导员面试
    C程序设计
    Excel VBA 基本概念
    Excel函数
    导入excel表的数据到数据库ssh
  • 原文地址:https://www.cnblogs.com/orzlin/p/9235918.html
Copyright © 2011-2022 走看看