Spring 中@AutoWire和@Resource两种注解的区别
下面是基于java,spring的代码,(jdk8,spring5.0)
下面实验代码在基于spring2.5的时候会出现和下面结果相反的结论,所以请参考的朋友看清楚我使用的是jdk8,spring5.0,以免出现不必要的错误
@AutoWire和@Resource两种注解都是做bean注入时使用的,但@Resource并不是spring的注解,它的包是javax.annotation.Resource(只要使用jdk,就可以了,里面包含着这个注解)
而需要导入,但是spring支持该注解.
这里先解释下byType,和byName下面提到的两个常提到的属性
byType: 即bean的class类型
byName:即bean的id属性的值
@AutoWire是按照 byType类注入的,需要导入spring的
org.springframework.beans.factory.annotation.Autowired包(导入bean包就没问题),
@Autowired默认按照byType的方式来匹配bean
第一种,这是按照属性注入的 (用于字段上)
public class DeptInfoservice {
@Autowired
private DeptInfoDao dao;
public void dept() {
dao.deptdao();
}
}
第二种,注入属性的set方法上
(这种更符合面向对象的思想,通过get,set去操作属性,而不是直接操作属性)
public class DeptInfoservice {
private DeptInfoDao dao;
public void dept() {
dao.deptdao();
}
public DeptInfoDao getDao() {
return dao;
}
@Autowired
public void setDao(DeptInfoDao dao) {
this.dao = dao;
}
}
注释:虽然第二种更符合面向对象的思想,通过get,set方法来操作属性,而不是直接操作属性,虽然第一种方法是没有那么严谨的符合面向对象思想,但是不影响使用,
本人常用的是第二种,原因嘛,很简单,就是省事,偷捷径,当然如果有不同意见,欢迎私信
@Resource
第二类 用bean注入的注解@Resource
它有两个参数,一个是name,一个type 默认情况使用byName
第一种不指定任何参数,默认按照byName来匹配对应bean,如果找不到对应的bean,则按照byType来匹配对应的bean.
public class DeptInfoservice {
@Resource
private DeptInfoDao dao;
public void dept() {
dao.deptdao();
}
}
第二种 指定byName,
public class DeptInfoservice {
@Resource(name="dao1")
private DeptInfoDao dao;
public void dept() {
dao.deptdao();
}
}
第三种指定type
当指定type时,先按照type匹配相应的bean,当有多个类型相同的bean时,通过name来自动匹配,确定唯一的对应的bean(查询了许多案例说如果指定了type,在配置文件中有多个type相同的bean,会报错,但是经过实验发现,如果有多个type相同的bean,会默认在按照byName来匹配)
public class DeptInfoservice {
@Resource(type=DeptInfoDao.class)
private DeptInfoDao dao1;
public void dept() {
dao1.deptdao();
}
}
第四种 同时指定byTyp,byName
按照指定的类型和name来确定唯一的Bean
public class DeptInfoservice {
@Resource(type=DeptInfoDao.class,name="dao1")
private DeptInfoDao dao;
public void dept() {
dao.deptdao();
}
}
小弟除写博客,欢迎指导