【Java】使用@Value @Reource或@Autowire依赖 (值) 注入时出现NPE的排查方法
首先想说明的是,@Value @Resource和@Autowire虽然都是用于依赖注入的Annotation,但是二者是有区别的。
1 Resource不依赖于Spring,后者相反,因此为了减少以来,尽量使用Resource;
2 Resource是优先按照变量名称匹配的,也可用@Resource(name="")指定要注入的变量名。Autowire则是优先按类型匹配,配合@Qualifier也可指定变量名。
3 不存在灵异事件!不存在灵异事件!不存在灵异事件!重要的事说三遍。如果出现了NullPointerException,那一定是代码写错了。
当出现被注入的变量被调用时抛出NPE,按照如下的经验排查:
0 Spring的xml配置文件是否都包含在classpath(resources、webapp甚至java都可)中,如果有多个xml文件,include的层次关系是否正确。
1 确定类所在的包是否被Spring扫描到。检查配置文件中是否有:
<context:annotation-config />
<context:component-scan base-package="me.xxx" />
<context:component-scan base-package="me.yyy" />
2 检查Bean是否有重复定义。
3 对于静态的依赖,要在其setter方法上加@Resource,目的是欺瞒Spring向一个静态变量进行注入。
<bean id="classType" class="....ClassType" /> static ClassType classType; @Resource
public void setClassType(ClassType classType) {
XXX.cXXXlassType = classType;
}
4 如果是在测试用例中使用@Resource时出现NPE,则考虑是不是Bean根本没有在applicationContext中创建。
可以用下面的方法写测试用例,以避免对大量的字段进行初始化(需要junit 4.9以上的版本):
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:/spring-XXX.xml"})
public class BaseTest extends AbstractJUnit4SpringContextTests {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
// add whatever you like.
}
} public class XXXXTest extends BaseTest {...}
当然如果明确地知道单个测试用例只需用到哪些上下文,也可以把这段写在测试用例XXXTest本身,避免每次都要加载整个上下文,导致重量级的用例。
5 如果要检查上下文是否正常创建,或者某个Bean是否在上下文中,可以直接用@Resource调出名为“applicationContext”的全局上下文。
【Java】使用@Value @Reource或@Autowire依赖 (值) 注入时出现NPE的排查方法的更多相关文章
- Java Spring学习笔记----Bean的依赖注入(设值注入方式)1
Spring常用的两种依赖注入方式:一种是设值注入方式,利用Bean的setter方法设置Bean的属性值:另一种是构造注入,通过给Bean的构造方法传递参数来实现Bean的属性赋值: 1.设值注入方 ...
- Java自动化测试框架-09 - TestNG之依赖注入篇 (详细教程)
1.-依赖注入 TestNG支持两种不同类型的依赖项注入:本机(由TestNG本身执行)和外部(由诸如Guice的依赖项注入框架执行). 1.1-本机依赖项注入 TestNG允许您在方法中声明其他参数 ...
- 《手把手教你》系列基础篇(七十八)-java+ selenium自动化测试-框架设计基础-TestNG依赖测试- 中篇(详解教程)
1.简介 上一篇讲解了依赖测试的各种方法,今天继续讲解依赖测试的方法,这一篇主要是讲解和分享通过xml文件配置组名依赖方法( 主要是测试组的用法).废话不说,直接上干货. 2.实例 测试组:一个组可包 ...
- Java学习-021-Properties 获取配置项对应的值
在日常的脚本编写过程中,通常会获取配置文件中的配置项,以执行相应的业务逻辑. 小二上码...若有不足之处,敬请大神指正,不胜感激! 获取配置项值的源码如下所示: /** * Get value fro ...
- java 一个函数EnumMap返回多个值
java 一个函数如何返回多个值 在开发过程中,经常会有这种情况,就是一个函数需要返回多个值,这是一个问题!! 网上这个问题的解决方法: 1.使用map返回值:这个方法问题是,你并不知道如何返回值 ...
- java中int,float,long,double取值范围,内存泄露
java中int,float,long,double取值范围是多少? 写道 public class TestOutOfBound { public static void main(String[] ...
- Java线程:新特征-有返回值的线程
http://lavasoft.blog.51cto.com/62575/222082/ Java线程:新特征-有返回值的线程 2009-11-04 17:33:56 标签:返回值 职场 线程 休闲 ...
- java -- 对Map按键排序、按值排序
java -- 对Map按键.按值排序 1.按键排序(sort by key) 直接上代码 ↓ public Map<String, Str ...
- java使用Filter过滤器对Response返回值进行修改
转:java使用Filter过滤器对Response返回值进行修改 练习时只做了对request 的处理,这里记录一下,filter 对 response的处理. 原文地址:java使用Filter过 ...
随机推荐
- 洛谷[P3622] 动物园
状压DP 发现本题中,每个小朋友是否高兴仅取决于其后五个动物的情况,我们可以用状压DP解决本题 首先已处理 num[i][s] 表示对于位置 i ,状态为 s 时有多少在 s 的同学满意 转移方程很好 ...
- CF 148D Bag of mice【概率DP】
D. Bag of mice time limit per test 2 seconds memory limit per test 256 megabytes Promblem descriptio ...
- the project was not built since its build……
[问题描述] 用eclipse编译程序时,出现下面错误: The project was not built since its build path is incomplete. Cannot fi ...
- reportlab包使用指南
reportlab.canvas有这六个主要参数 1.pagesize:设置纸张大小 #from reportlab.lib.pagesizes import letter, A4 导入常见的 ...
- bytearray和file的后端上传方式
public static String readAndUpload(String serverpath,String imgid) { if(serverpath==null){ serverpat ...
- Oracle SID爆破工具SidGuess
Oracle SID爆破工具SidGuess 在Oracle中,SID是System IDentifier的缩写.SID是一个数据库的唯一标识符.当用户希望远程连接Oracle数据库时,则需要知道 ...
- Python: Write UTF-8 characters to csv file
To use codecs, we can write UTF-8 characters into csv file import codecs with open('ExcelUtf8.csv', ...
- SecureCRT字体大小随屏幕调节设置
- [置顶]
个人微信号发送zabbix告警信息
之前使用邮件和短信发送zabbix告警信息,但告警信息无法实时查看或者无法发送,故障无法及时通知运维人员. 后来使用第三方微信接口发送信息,愉快地用了一年多,突然收费了. zabbix告警一直是我的痛 ...
- Linux下报错:Segmentation fault.
遇到的问题:程序在读文件之后,准备执行fclose(fp);时,出现了如下错误: Program received signal SIGSEGV, Segmentation fault. 解决方法:倒 ...