@Autowire和@Resource二者都是注解方式动态装配bean,但是二者又有所区别。
1、@Autowire
默认按照类型(by-type)装配,默认情况下要求依赖对象必须存在。
①如果允许依赖对象为null,需设置required属性为false,即
@Autowire(required=false)
private UserDao userDao;
②如果使用按照名称(by-name)装配,需结合@Qualifier注解使用,即
@Autowire
@Qualifier("userDao")
private UserDao userDao;
2、@Resource
默认按照名称(by-name)装配,名称可以通过name属性指定。
①若没有指定name
- 当在字段上注解时,默认取name=字段名称装配。
- 当在setter方法上注解时,默认取name=属性名称装配。
②当按照名称(by-name)装配未匹配时,按照类型(by-type)装配。
- 当显示指定name属性后,只能按照名称(by-name)装配。
注意: @Resoure装配顺序
- 若指定name属性,则按照名称(by-name)装配,未找到则抛异常;
- 若指定type属性,则按照类型(by-type)装配,未找到或者找到多个则抛异常;
- 若同时指定name和type属性,则找到唯一匹配的bean装配,未找到则抛异常;
- 若既未指定name属性,又未指定type属性,则按照名称(by-name)装配;如果未找到,则按照类型(by-type)装配
3、二者对比
对比项 | @Autowire | @Resource |
装配方式 | 优先按类型 | 优先按名称 |
作用范围 | 字段、构造器 、setter方法 | 字段、setter方法 |
属性 | required | name、type |
注解来源 | Spring注解 | JDK |
注意 | 作用范围在字段上,均无需在写setter方法 |