new 的线程导入无法通过 @Autowired 注入

2019-06-27 16:19:42 +08:00
 zy2019

项目 spring boot + gradle + netty,

我在项目启动时创建了这么一个线程: new UdpServerThread(8000).start(); 直接启动 netty 的服务器

然后这个作为服务器接收客户端信息在 protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket packet) 中接收信息

接收到信息后,会把收到的数据传给方法 A

方法 A 中会通过 @Autowired DataCache dataCache; 去调用缓存

现在的话就一直在调用 dataCache 时报空指针

大概查了下,问题可能出现 new 的线程不在 spring 容器中,但查到的解决办法不是很好,所以想问下,一般这个改怎么解决呢?

3160 次点击
所在节点    Java
10 条回复
hfc
2019-06-27 17:03:19 +08:00
UdpServerThread 类中加一个成员变量,再通过 set 方法赋值
anakinsky
2019-06-27 17:03:25 +08:00
封装个 SpringBeanUtils,beanFactory.getBean(beanName);
Ahaochan
2019-06-27 17:10:00 +08:00
guoyuchuan
2019-06-27 17:35:58 +08:00
new 的怎么能调用 spring 容器的 bean ;
guoyuchuan
2019-06-27 17:39:18 +08:00
new 之前在类中加载 spring 容器就行;
方法很多,百度 spring Aware 接口 就知道怎么做了;
gz911122
2019-06-27 17:39:20 +08:00
UdpServerThread 被 spring 管理了吗
guoyuchuan
2019-06-27 17:41:20 +08:00
alangz
2019-06-27 17:43:42 +08:00
你自己实例化的对象自然没法直接让 Spring 帮你注入依赖,你需要获取到 IoC 的上下文(多种方式),然后通过这个上下文来拿到被 Spring 管理的 Bean。
Spring 的核心还是应该多看看。
arthas2234
2019-06-27 18:19:49 +08:00
不要通过 new 来启动,可以使用 @PostConstruct 注解或者实现 ApplicationRunner、CommandLineRunner 接口来启动
你的 handler 也要设成组件并通过注入来初始化
nutting
2019-06-27 18:27:48 +08:00
用 spring 你就都得 spring 接管对象才能依赖

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/578038

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX