【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过 ...
随机推荐
- jQuery 拖动排序
原文发布时间为:2010-04-11 -- 来源于本人的百度文章 [由搬家工具导入] <!DOCTYPE html><html lang="en">< ...
- scrapy实战
采用scrapy实现对股票网站的爬取 功能描述: 技术路线:scrapy 目标:获取上交所和深交所所有股票名称和交易信息并存储 实例编写: 步骤1:建立工程和spider爬虫模板 步骤2:编写spid ...
- hdu 4525(数学)
威威猫系列故事——吃鸡腿 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tota ...
- AndroidStudio不重新运行,Debug调试已有进程
们在使用AndroidStudio进行编写Android应用程序的时候,经常需要对抛出的问题进行断点调试跟踪,如果不知道怎样直接调试已经运行的进程.那么调试的效率会非常低下!下面我就来教大家如何快速调 ...
- svn安装配置使用小总结
1svn:版本控制系统服务端与客户端协作服务端:subversion客户端:eclipse_svn_site-1.10.5.zip插件1安装问题: 1subversion版本过高 会出现版 ...
- ATOM入坑必备插件
Atom作为Javascript/CSS/HTML等前端编辑器利器,其强大功能依靠各种插件,以下是笔者在入坑阶段,精挑细选总结出的必不可少的插件,熟悉运用这些插件,一定成吨提高生产效率.安装这些插件只 ...
- 关于js延迟加载(异步操作)的方式
一.概述 最近重新开始学习js,在第一章的一个小节里写到了“脚本调用策略”,书上写的这部分不多,但是发现在我之前的(笔)面试中,问到的频率还是比较高的.自己一直习惯于直接把所有js文件写在head里, ...
- 洛谷——P2040 打开所有的灯
P2040 打开所有的灯 题目背景 pmshz在玩一个益(ruo)智(zhi)的小游戏,目的是打开九盏灯所有的灯,这样的游戏难倒了pmshz... 题目描述 这个灯很奇(fan)怪(ren),点一下就 ...
- Topcoder SRM 668 DIV 2
VerySecureEncryption 模拟 题意: 给你个串message,然后一个置换key,输出置换K次后的结果. 题解: 直接模拟就好. 代码: #include<iostream&g ...
- 从客户端(ExportContent="...ontinuous <br />Pass Count":13...")中检测到有潜在危险的 Request.Form 值。
mvc中,用chrome浏览器导出excel提示如题错误的解决办法. <system.web> <httpRuntime requestValidationMode="2. ...