Springboot 用 @Autowired 的坑

2019-05-22 21:25:42 +08:00
 gramyang
我想很多老铁可能都碰到过,就是在 springboot 的非 controller 中使用 @Autowired 引发的空指针。

我这里的 handler 报空指针:

public class NettyHandler extends ChannelInboundHandlerAdapter {
private ConcurrentHashMap<Long, Channel> channelMap;
private Long key = System.currentTimeMillis();
@Autowired
private PlayerInfoHandler handler;

查了一下,不少人都遇到过这样的问题,一个解决方法: https://blog.csdn.net/georgeshaw1/article/details/74943089

代码:
@Autowired
protected HealthDataService healthDataService;
private static ServerHandler serverHandler ;
@PostConstruct //通过 @PostConstruct 实现初始化 bean 之前进行的操作
public void init() {
serverHandler = this;
serverHandler.healthDataService = this.healthDataService;
// 初使化时将已静态化的 testService 实例化
}

我这边试了一下不行啊。。。。咋搞呢??
10735 次点击
所在节点    Java
37 条回复
szq8014
2019-05-23 08:31:26 +08:00
@gramyang 从你目前的情况来看个人觉得用 ApplicationContext.getBean(clazz) 更方便一些,至于 ApplicationContext 怎么拿,最简单的方法就是 springboot 的 main 方法里面唯一的那行调用其实是有返回值的,而且返回值就是那个 ApplicationContext
BBCCBB
2019-05-23 08:54:05 +08:00
这个的确是你用法不对...
ala2008
2019-05-23 08:58:19 +08:00
ioc 了解一下
linyinma
2019-05-23 09:17:31 +08:00
小哥拉屎拉不出来乖茅坑没设计好~~
Yuicon
2019-05-23 09:26:22 +08:00
学习理论的重要性
liujan
2019-05-23 09:53:52 +08:00
spring 注入的话需要保证被注入的类和注入的类都在 spring 的 bean 容器了。可以加 @Component
rffan
2019-05-23 09:55:47 +08:00
你这个是基本不了解 Spring 啊不是坑啊。
hailiang88
2019-05-23 09:58:02 +08:00
先尝试下手撸个 ioc 吧
Ahaochan
2019-05-23 10:40:12 +08:00
在非 Spring 管理的类下, 使用 SpringContextHolder 解决. 注意初始化顺序.

https://github.com/Ahaochan/project/blob/master/ahao-utils/src/main/java/com/ahao/util/spring/SpringContextHolder.java
gramyang
2019-05-23 10:53:07 +08:00
@Ahaochan 我就是这么解决的,这个是正解
zcating
2019-05-23 10:54:00 +08:00
兄 dei,要么你就为这个类添加注解 @Component,要么就写个 config,为 NettyHandler 写个工厂方法 ,在工厂方法上添加注解 @Bean
gabon
2019-05-23 12:06:40 +08:00
kangzai50136
2019-05-23 13:05:50 +08:00
多了解 Spring 吧。
brust
2019-05-23 13:42:56 +08:00
@tedzhou1221 我 idea 怎么没绿色豆子,可以截图标志 发链接看看嘛,或者邮箱 YnJ1c3RAYnJ1c3QuY24=
arthas2234
2019-05-23 14:03:46 +08:00
handle 类上面加 @Component 注解
@ComponentScan 的配置也要确保你的 handle 被扫描到
Chinsung
2019-05-23 15:54:16 +08:00
Spring 只管理你所配合的类,通过注解、javaconfig、xml 这 3 个配置的类。通过这 3 者配置起来的类互相之间才能由 spring 管理依赖关系。
你这个 handler 要加上 @Compoment 注解,然后再启动类上加上 CompomentScan 或者在 xml 里配置 CompomentScan,这个类才能应用 Autowire 等注解注入依赖
EastLord
2019-05-26 14:16:39 +08:00
其实现在不用 @Autowired 也行,直接构造注入

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

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

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

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

© 2021 V2EX