@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();
    }
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值