Request processing failed: java.lang.NullPointerException: Cannot invoke “com.atguigu.service.EmployeeService.queryList()” because “this.employeeServiceImpl” is null
在整合ssm项目时,发现如下异常:
报错原因是controller层在调用service层时,发现service是空,找不到对应的Bean组件。说明问题肯定出现在controller层和service层,空指针异常问题一般都是找不到对应的组件,说明组件存放到IoC容器时出现了问题。
分别检查controller层和service层的代码,是否注解出现问题:
发现该放入IoC容器的都已经放进去了,按理说不应该有问题,于是考虑是不是因为:虽然组件放进IoC容器,但是没有命名,controller层找不到具体的组件呢?但是@Resource注解在效果上就等同于@Autowired+@Qualifier,应该不存在上述问题,很疑惑!!!
抱着试试看的心理,把所有的@Resource注解替换成了@Autowired注解:
发现竟然问题解决了!
深入研究一下:
为什么将控制层和业务层的@Resource注解替换成@Autowired注解后,就不报错了,按理说@Resource注解不是更好吗?
- @Resource和@Autowired注解的区别:
- 简单区别:pass
- 真正区别:
@Autowired注解默认按类型进行注入的,结合@Qualifier注解才是按名称进行注入
@Resource注解默认是按名称来进行注入的
- 失败原因:
@Resource按默认名称进行注入,如果Spring上下文中没有与字段名称匹配的bean,注入会失败,导致该字段保持为“null”,也就是说:你的字段名称是service,而Spring上下文中没有一个bean的名称是service,则注入会失败。