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
Netty handler处理类无法使用@Autowired注入bean的解决方法的更多相关文章
- SpringBoot拦截器中无法注入bean的解决方法
SpringBoot拦截器中无法注入bean的解决方法 在使用springboot的拦截器时,有时候希望在拦截器中注入bean方便使用 但是如果直接注入会发现无法注入而报空指针异常 解决方法: 在注册 ...
- java学习笔记38(sql注入攻击及解决方法)
上一篇我们写了jdbc工具类:JDBCUtils ,在这里我们使用该工具类来连接数据库, 在之前我们使用 Statement接口下的executeQuery(sql)方法来执行搜索语句,但是这个接口并 ...
- zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法
转载自:http://blog.csdn.net/wide288/article/details/21622183 zend studio中ctrl+鼠标左键无法转到类或函数定义文件的解决方法: ze ...
- 动态调用webservice时 ServiceDescriptionImporter类在vs2010无法引用的解决方法
[导读]ServiceDescriptionImporter是创建Web Service 时使用的类,它是引用继承System.Web.Services 当我将VS2005里写的一段代码放在VS201 ...
- Spring自动扫描无法扫描jar包中bean的解决方法(转)
转载自:http://www.jb51.net/article/116357.htm 在日常开发中往往会对公共的模块打包发布,然后调用公共包的内容.然而,最近对公司的公共模块进行整理发布后.sprin ...
- 关于swift语言中导入OC三方类找不到头文件的解决方法
首先我遇到的问题是这样的: 我之前封装的OC类,我导入现在的swift工程中,然后建立桥接文件,在Swift的控制器中可以找到这个OC写的东西. 但是问题来了,当你使用cocoapods导入的OC三方 ...
- 关于Test类中不能使用Autowired注入bean的问题
在测试类中使用AutoWired注解一直不能获取到Bean,调用方法时一直报空指针异常,我有在其他类中使用AutoWired试了下,发现能够生效.问题应该就是处在Test类中,后面找了半天终于找到问题 ...
- SSM项目中,关于Test类中不能使用Autowired注入bean的问题
在测试类中使用AutoWired注解一直不能获取到Bean,调用方法时一直报空指针异常,我有在其他类中使用AutoWired试了下,发现能够生效.问题应该就是处在Test类中,后面找了半天终于找到问题 ...
- 解决 spring boot 线程中使用@Autowired注入Bean的方法,报java.lang.NullPointerException异常
问题描述 在开发中,因某些业务逻辑执行时间太长,我们常使用线程来实现.常规服务实现类中,使用 @Autowired 来注入Bean,来调用其中的方法.但如果在线程类中使用@Autowired注入的Be ...
随机推荐
- 解决Centos下yum无法更新
问题: http://mirrors.cloud.aliyuncs.com/epel/6/x86_64/repodata/repomd.xml: [Errno 14] PYCURL ERROR 6 - ...
- HTTP协议中PUT和POST使用上的区别
有的观点认为,应该用POST来创建一个资源,用PUT来更新一个资源:有的观点认为,应该用PUT来创建一个资源,用POST来更新一个资源:还有的观点认为可以用PUT和POST中任何一个来做创建或者更新一 ...
- C语言函数调用栈(一)
程序的执行过程可看作连续的函数调用.当一个函数执行完毕时,程序要回到调用指令的下一条指令(紧接call指令)处继续执行.函数调用过程通常使用堆栈实现,每个用户态进程对应一个调用栈结构(call sta ...
- git入门与实践【转】
转自:http://www.cnblogs.com/shenhaocn/archive/2011/03/13/1982957.html 什么是版本控制 要了解什么是git,首先需要了解什么是版本控制( ...
- openstack常见问题解决方法总结
一.创建实例失败: 首先用下面命令查看服务是否正常 1. nova-manage service list 如果不正常,则使用下面命令重启,如果还不行,则查看日志, 1. service nova-a ...
- makefile 字符串处理函数
截取自<跟我一起写Makefile> (1) $(subst <from>, <to>, <text>) 名称: 字符串替换函数 subst 功能: ...
- SpringMVC中fastjson支持jsonp的实现
前边一篇文章主要说了下前端处理jsonp的方式,这篇主要介绍了后台接收和响应jsonp的一种方式 继承fastjson消息转换器类:com.alibaba.fastjson.support.sprin ...
- 在window是下安装hadoop过程
详细见http://www.cnblogs.com/kinglau/archive/2013/08/20/3270160.html
- 解执行maven项目出现 SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”. error
最近再弄maven项目,运行起来没有问题,但是Console控制台会报错,比如说如下的问题异常提示: 由此我们可以看出,报出错误的地方主要是slf4j的jar包,而故障码中“Failed to loa ...
- 怎么在Eclipse上运行静态网页
1. 前言 习惯用Eclipse开发动态网站,现在有一个静态网页(只有Html,Js,CSS代码,无后台Java代码)想跑一下,自己通过网上查询然后自己也研究捣鼓了一下,发现有三种方式可以发布静态网页 ...