最近一直在互联网公司实习,遇到了一个独立开发一个sdk的需求。依赖于以前自己的项目经验,首先创建了一个Maven项目,然后引入Spring的依赖,然后开始一顿劈啦啪啦疯狂输出,等到写完install运行demo测试的时候,疯狂的NPE(NullPointerException)击垮了我最后的心理防线。
接下来,我就给大家提供一下我出错的思路并复显一下当时的场景。希望大家能够从中得到一些思路。
当你发现业务组件中的某个属性通过@Autowired或者@Resource注入之后值为null时,我想你的第一反应是不可思议(PS:我淦,神:racehorse:鬼?我的代码没有问题,一定有其他原因)。遇到这种情况,不要惊慌,微信面对,客服恐惧最好的办法就是战胜恐惧,奥利给。
其实发生这种问题大家谁都不想的吗,既然出现了,我建议你首先检查自己的Spring配置,毕竟如果连配置都有问题,那Spring就是神仙,没办法正确的帮我们完成装配的工作。
检查的点有几个:
通过以上的检查,我们首先要保证我们的Bean能够交付给Spring容器进行统一的管理。
这一点也是很多初学者常见的错误,我内部属性都注入了,为什么我new了一个对象,里面的属性值全是null?这可一点都不快乐。出现这个问题主要是我们获取对象的方式除了错。我们知道,Spring就是一个bean的容器,由Spring负责对象的初始化和依赖注入。当我们想要获取一个Bean的实例时,我们应该从Spring容器当中获取。如:new ClassPathXmlApplicationContext("classpth:applicationContext.xml").getBean(String beanName);又或者,我们应该依靠注解,由Spring帮助我们将依赖注入。而如果我们自己new一个类的实例,便绕过了容器的依赖注入过程,因此也可能出现获取不到应有的属性这种情况。
楼主在写代码时出现的第一个注入为空的场景,就是把@Autowired注解加在了一个静态属性上。当时的抓耳挠腮让我至今记忆犹新,不过冷静下来之后仔细思考,竟能一窥究竟。Spring能够帮助我们做属性的自动注入,是在帮助我们实例化Bean之后完成的。而static属性是归属于类而不是实例的。换句话说,当我们想给static属性注入值的时候,对象还没创建的。因此一定会出现注入为空的情况。
这种情况是在业务当中真实可能出现,并且并不好思考的地方。楼主遇到的场景是实现了一个Filter,在Filter当中需要注入业务层组件实现一些过滤逻辑。代码写完之后我发现ServerBean一直为空,我把上面三种方式可能出现问题的地方都做了检查也没有解决。后来Google了一下让我茅塞顿开。原来web容器启动是按照一定顺序的,即:Listener --> Filter -->Servlet。而我们的Service组件依赖与Servlet的Controller组件而创建,因此在创建Filter实例时,由于Servlet实例还没有初始化也会导致依赖无法注入的情况。
综上,当我们的项目当中出现类似问题的时候,并不需要过于紧张。只需要冷静下来,用自己的所学仔细思考就一定可以得到自己想要的反馈。希望能够帮助到各位。