@Resource注入的bean为空浅析

spring在依赖IOC编程方面,提供了两种方式注入Bean,XML配置和使用注解+自动扫描package的方式

1.@Resource应用在字段上,则注入规则是:
a.先使用字段名字匹配bean,查找到bean则注入,如果类型不匹配则此时有异常,注入失败
b.如果字段名字没有匹配到Bean则spring会尝试采用字段类型匹配,如果找打bean则注入,如果字段类型是接口则有可能会匹配到多个类型,则会抛出匹配到多个bean的异常.
注入失败.

2.@Resource应用在setter上(应用到属性),则注入规则是:

a.先使用属性名字匹配bean,查找到bean则注入,如果类型不匹配则此时有异常,注入失败
b.如果属性名字没有匹配到Bean则spring会尝试采用属性参数类型匹配,如果找打bean则注入,如果属性参数类型是接口则有可能会匹配到多个类型,则会抛出匹配到多个bean的异常.
注入失败.

注意是属性的参数类型,并不是属性的类型,注意区别 

3.小结
a.名称------>b.类型或参数类型(属性时).

问题

// 工具类:
@Component
public class PdfUtil {

    @Resource
    private PublicConfig publicConfig;

    public void test() {
        System.out.println("配置文件的绝对路径:" + publicConfig.getResourceAbsolutePath());
    }
}

// 服务类:
@Service
public class PdfService {

    public void usePdfUtil() {
        PdfUtil pdfUtil = new PdfUtil();
        pdfUtil.test();
    }
}
当调用服务类时,工具类会报空指针异常,publicConfig为null
这是因为在服务类中PdfUtil的实例是new出来的,并不是spring注入的,也就是说虽然工具类方法上也标注了注解@Component,但实际应用是我们并没有应用,所以在new出来的实例中应用spring的@Resource来获取配置信息是不可能得到的
要想在工具类中应用@Resource,则需要用同样的方式获取PdfUtil的实例,由spring来注入
修改如下:

// 服务类
@Service
public class PdfService {

    @Resource
    private PdfUtil pdfUtil;

    public void usePdfUtil() {
        pdfUtil.test();
    }
}


阅读更多
想对作者说点什么? 我来说一句
相关热词

没有更多推荐了,返回首页

关闭
关闭
关闭