注解@Autowired和@Resource的区别 以及字段注入和setter注入的区别

1、@Autowired 默认按类型装配
例如:private PersonDao  personDao;默认按PersonDao装配。

2、@Resource默认按名称装配
例如:private PersonDao  personDao;默认按personDao装配。
personDao是xml中id的值。
<bean id="personDao" class="PersonDao"/>

3、@Resource应用在字段(成员变量)上,则注入规则是:
a.先使用字段名字匹配bean,查找到bean则注入。
  如果bean中定义的类型与注入的类型不匹配则异常
b.如果字段名字没有匹配到Bean
  则会尝试采用字段类型匹配,如果找到bean则注入
  如果字段类型是接口则有可能会匹配到多个类型,则会抛出匹配到多个bean的异常.(见下面例子)

4、@Resource应用在setter上注入规则是:
a.先使用属性名(下面代码参数中得personDao)匹配bean
  如果bean中定义的类型与注入的类型不匹配则异常
public void setPersonDao(PersonDao personDao) {
this.personDao = personDao;
}
b.如果属性名字没有匹配到Bean
  则会尝试采用属性参数类型匹配
  如果找到bean则注入,如果属性参数类型是接口则有可能会匹配到多个bean的异常.注入失败.(见下面例子)
  所以,一般采用实现类做为set方法的参数。
  这也是之所以有字段注入还存在set注入的原因。

理解字段注入和set注入区别的例子。

//接口IUserDao
public interface IUserDao;
//接口实现1
public class UserDao1 implements IUserDao {...};
//接口实现2
public class UserDao2 implements IUserDao {...};
 
1、采用字段名称,则会注入失败(3、4中提到的b中匹配多个bean的异常)
@resource
private IUserDao userDao;


2、采用set方法注入,则可以注入UserDao1
@resource
public void setUserDao(UserDao1 userDao)
//注入UserDao2 
@resource
public void setUserDao(UserDao2 userDao)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值