码迷,mamicode.com
首页 > 编程语言 > 详细

【Java】使用@Reource或@Autowire依赖注入时出现NPE的排查方法

时间:2016-04-22 18:30:18      阅读:317      评论:0      收藏:0      [点我收藏+]

标签:

首先想说明的是,@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方法。Spring在帮我们注入依赖时,依赖该变量的setter方法,而如果缺少,会无任何提示地注入失败。

@Resource
ClassType classType;

public setClassType(ClassType classType)  {
    this.classType = classType;
}

4 对于静态的依赖,要在其setter方法上加@Resource,目的是欺瞒Spring向一个静态变量进行注入。

static ClassType classType;

@Resource
public setClassType(ClassType classType)  {
    this.classType = classType;
}

5 如果是在测试用例中使用@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本身,避免每次都要加载整个上下文,导致重量级的用例。

6 如果要检查上下文是否正常创建,或者某个Bean是否在上下文中,可以直接用@Resource调出名为“applicationContext”的全局上下文。

 

 

【Java】使用@Reource或@Autowire依赖注入时出现NPE的排查方法

标签:

原文地址:http://www.cnblogs.com/zhchngzng/p/5422173.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!