【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过 ...
随机推荐
- SQl性能优化1
原文发布时间为:2010-11-05 -- 来源于本人的百度文章 [由搬家工具导入] 性能优化,从上面我说的两点来考虑优化,主要是以Sql为主,平台暂不介绍,我们现在使用的数据库以SQL Server ...
- duilib入门简明教程 -- VS环境配置(2) (转)
原文转自:http://www.cnblogs.com/Alberl/p/3342030.html 既然是入门教程,那当然得基础点,因为搜索duilib相关资料时,发现有些小伙伴到处都是编译错 ...
- manjaro中okular中的pdf文件无法显示中文
最近发现Manjaro下用Okular打开含有中文的PDF文档时,许多地方显示空白, 开始怀疑是中文字体问题,但是其他的软件中文显示都是正常的. 接着,调整Okular中的中文字体,显示还是不正常. ...
- Selenium2+python自动化1(环境安装)
前言 目前selenium版本已经升级到3.0了,网上的大部分教程是基于2.0写的,所以在学习前先要弄清楚版本号,这点非常重要.本系列依然以selenium2为基础,目前selenium3坑比较多,暂 ...
- [SaltStack] Return日志入库审计
SaltStack日志return审计 在我们执行salt任务时, 默认日志是屏幕打印的, 对于我们审计任务运行情况带来很不方便, 因此我们对日志结果进行了二次开发, 将job日志处理后入库, 方便查 ...
- linux 常用命令: runuser
rpm: coreutils-8.4-9.el6.x86_64 runuser --help 用法:runuser [选项]... [-] [用户 [参数]... ] Change the effec ...
- Java IO 学习(三)缓冲IO / 直接IO / 内存映射
缓冲IO 在介绍缓冲IO之前需要先了解一下常用的机械硬盘的原理与特点 一个机械硬盘中装有多个盘片 每个盘片上有多个同心圆(磁道) 每个同心圆又由多个弧(扇区)组成,每个弧上都记录了等量的数据(比方说5 ...
- CSU 1779: 错误的算法【矩阵/模拟】
Description 有道题目是这样的: 输入一个 n 行 m 列网格,找一个格子,使得它所在的行和列中所有格子的数之和最大.如果答 案不唯一,输出任意解即可.比如,在下面的例子中,最优解是(1,3 ...
- Codeforces Round #490 (Div. 3)
感觉现在\(div3\)的题目也不错啊? 或许是我变辣鸡了吧....... 代码戳这里 A. Mishka and Contes 从两边去掉所有\(≤k\)的数,统计剩余个数即可 B. Reversi ...
- 【spring boot logback】日志logback格式解析
日志logback格式解析 logback官网 格式解析 https://logback.qos.ch/manual/layouts.html#ClassicPatternLayout 官网格式解析有 ...