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

问题由来:

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

解决过程:

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

2.之后百度发现有不少人遇到这个问题,有回答说netty中无法使用注入的bean,需要主动通过getBean的方式来获取,这下问题基本上已经确定了,并不是配置的问题,而且netty本身自带的问题

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.set(key,600,ctx.channel());
    }
}

参数文章:

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

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

原文地址:https://www.cnblogs.com/orzlin/p/9235918.html

时间: 2024-08-28 21:05:51

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

红外遥控库IRremote的IRsend类sendRaw函数溢出问题及其解决方法

最近在调试红外遥控格力空调,在论坛中学到了不少东西.参考: (1)<解决问题系列(4)--红外编码分析利器使用> (2)<315Mhz模块传输替代315Mhz遥控器> 调试环境: 软件:Arduino IDE 1.0 硬件:Arduino uno r3 问题分> 我使用的遥控器型号是YAD0F. 在使用逻辑分析仪dump出原始码之后,使用sendRaw函数来发送原始码,发现空调没有反应.原始码如下: 9004,4499,699,1609,697,511,695,511,695

zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法

zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法: zendstudio 时常 无法ctrl+左键 跳转 到函数源 代码 是创建工程的方式造成的,很有可能是把先前存在的工程以file的形式导入, zendstudio 就把工程当作文档来处理了.解决的办法是: 右键点击工程->configure->add php support 然后系统会自动rebuild工程/workspace.至此,问题解决! 如果你想要zendstudio支持javascript的语法高亮和流

Java 各级注解及@Autowired注入为null解决办法

1.@controller 控制器 用于标注控制层,相当于struts中的action层. 2.@service 服务层 用于标注服务层,主要用来进行业务的逻辑处理. 3.@repository DAO层(Repo层) 用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件. 4.@Autowired 注入实例 表示被修饰的类需要注入对象,spring会扫描所有被@Autowired标注的类,然后根据 类型 在ioc容器中找到匹配的类注入. 5.@Component (把普通pojo实例

踩坑了!使用 @Autowired 注入成功,GetBean 方法却获取不到?!

本文首发于个人微信公众号:Coder小黑 踩坑了?! 之前推文已经讲过 当@Transactional遇到@CacheEvict,你的代码是不是有bug! 现在要在事务提交之后清除缓存.在Spring4.2 之后,可以使用@TransactionalEventListener选择在事务提交之后再消费对应的事件. 为了方便发送事件,偷懒使用了静态方法: 其中,SpringUtil.getBean()方法的内部实现为: 满心欢喜写完代码,一运行,直接报错,报错信息为 IoC 容器中不存在Applic

myeclipse下原来好使的项目,tomcat启动找不到sessionFactory的bean的解决方法

org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'sessionFactory' is defined 这个问题发生的很突然,网上各种找都是说没有配置啊,没有加载啊,没有~~~~~ 其实我这个原因是myeclipse有缓存了,具体解决方法: 点解工具栏 Project ->Clean,默认点选Clean all projects,也可以点选Clean projects selected

SpringBoot项目使用多线程处理任务时无法通过@Autowired注入bean

最近在做一个"温湿度控制"的项目,项目要求通过用户设定的温湿度数值和实时采集到的数值进行比对分析,因为数据的对比与分析是一个通过前端页面控制的定时任务,经理要求在用户开启定时任务时,单独开启一个线程进行数据的对比分析,并将采集到的温湿度数值存入数据库中的历史数据表,按照我们正常的逻辑应该是用户在请求开启定时任务时,前端页面通过调用后端接口,创建一个新的线程来执行定时任务,然后在线程类中使用 @Autowired 注解注入保存历史数据的service层,在线程类中调用service层保存

Spring 注解Autowired自动注入bean异常解决

错误: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'xx' is defined 错误的一般解决办法: 1.看xxbean是否已经注入,或者得到的bean名字错误. 2.看spring的配置文件<context:component-scan base-package="com.xx"></context:component-scan>是否扫描了 c

Win7无法使用VPN的原因与解决方法(一)

如果Windows 7不是通过正常安装途径的话,像Ghost错误.系统环境改变等,都有可能导致无法使用VPN,而且由于原因不同,给出的提示也不尽相同.实际上,万变不离其宗, VPN是要依靠Windows 7的四个系统服务的:Remote Access Connection Manager.Remote Access Auto Connection Manager.Secure Socket Tunneling Protocol Service.Windows Event Log.经反复实验,我发

SQL注入原理与解决方法代码示例

一.什么是sql注入? 1.什么是sql注入呢? 所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令,比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击.如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生sql注入. 黑客通过SQL注入攻击