Netty的handler类无法进行spring的注入service等操作,注入为null情况
项目使用场景
在springboot结合netty过程中,在handler处理器中注入发现报错,显示空指针异常。可是明明添加了spring的注解注册到容器中为什么没有用?
原因
netty自身维护了一套管理机制,handler类的实例是由netty自身创建和管理的。因此,Spring 无法自动将依赖注入容器
中。
具体原因请百度细查他们的生命周期
解决方法
- 写一个工具类获取
ApplicationContext
- 使用工厂模式
上述两种自行百度,这里只做小体量项目中可以方便用到的。
代码
@Slf4j
@Component
public class WebSocketFrameHandler extends ChannelInboundHandlerAdapter {
@Resource
private UserService userService;
public static WebSocketFrameHandler webSocketFrameHandler;
@PostConstruct
public void init() {
webSocketFrameHandler = this;
}
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
webSocketFrameHandler.userService.方法
}
}
在Bean 初始化完成后,Spring 会调用 init()
方法。在 init()
方法中,将当前实例(this
)赋值给静态变量 webSocketFrameHandler
,从而可以在静态上下文中访问实例变量。
水一篇