记录一个@Autowired的case
记录背景:
编写一个redis计次的工具类,记录需要计次的场景,然后从数据库中获取最高限次值做对比,当记录值达到限次值时做相应的处理。
计次工具类需要注入redis工具类,通过@Autowired注入,写法如下
在测试时,竟然发现空指针抛出~
查阅相关资料,得出如下结论:
@Autowired注入的spring容器内的对象,静态成员是类的属性,而非对象的属性,类的装载是在程序初始化的时候,此时spring容器可能都没有初始化,何况依赖其注入。此时静态成员依旧为null,故而调用时NPE抛出。
解决方式贴出:
静态成员去掉@Autowired,下方添加该静态成员的非静态setter方法
到达限次值,验证码处理成功,NPE没跑出来
错误方式贴出:
按照网上同胞的方式,通过SpringUtil.getBean()获取bean,然后在静态块中将其引用赋给该静态成员
发现程序无法启动,SpringUtil.getBean()时报空指针。是不是这种方式不需要spring托管呢,将@Component去掉再试一下
还是有问题,程序是可以正常启动了,但是调用到时,报类加载异常
可能是我理解的有问题,或者该网友有些关键点没写到,如果有用本方法试验成功的同学,欢迎一起探讨。