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