1、@Autowired 默认按类型装配
例如:private PersonDao personDao;默认按PersonDao装配。
2、@Resource默认按名称装配
例如:private PersonDao personDao;默认按personDao装配。
personDao是xml中id的值。
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注入的原因。
例如: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)