相信对如今Java码农来讲,@Autowired跟@Resource并不陌生,两者均可以自动注入,可是二者的区别不少时候并无被注意到。java
@Autowired是Spring提供的注解,须要导入包org.springframework.beans.factory.annotation.Autowiredspring
@Resource是由J2EE提供的注解,须要导入包javax.annotation.Resourceui
也就是说@Autowired是外部包导入的,而@Resource是J2EE本身的this
@Autowired默认按照byType自动注入spa
@Autowired采起的是按照类型进行自动注入的,Autowired源码中只有一个属性required(稍后介绍)。code
说明@Autowired没法人为去干预注入规则的,而后当容器中同一类型的bean存在多个的话,@Autowired该如何去选择呢,这时就须要@Qualifier注解来帮忙了。对象
@Qualifier跟@Autowired来自同一包下,存在一个属性value,咱们能够经过value属性来肯定@Autowired具体注入的是哪个bean。blog
若是匹配不到对象时,将会抛出异常 BeanCreationException。源码
若是匹配到多个对象时,也会抛出异常。io
public class UserService { @Autowired @Qualifier(value="userDao1") private UserDao userDao; private ManDao manDao; @Autowired public void setUserDao(@Qualifier("manDao") ManDao manDao) { this.manDao = manDao; } }
@Resource默认按照byName自动注入
@Resource注解在注入规则上存在两个属性:name、type
一、若没有使用属性,则经过反射机制,默认按照byName方式进行装配,若是没有匹配,则再类型进行装配;
二、若只使用了name属性,则使用byName的自动注入策略,从上下文中查找名称id,若是匹配不到则抛出异常;
三、若只使用了type属性,则使用byType自动注入策略,从上下文中找到类型匹配的惟一bean进行装配,找不到或者找到多个都会抛出异常;
四、若两个属性都使用了,则须要找到惟一匹配的bean进行装配,找不到则抛出异常。
public class UserService { @Resource private UserDao userDao; @Resource(name="studentDao") private StudentDao studentDao; @Resource(type="TeacherDao") private TeacherDao teacherDao; @Resource(name="manDao",type="ManDao") private ManDao manDao; }
@Autowired:默认按照类型进行装配,默认状况下要求依赖的对象必须存在,若是须要容许null值,则须要设置required属性为false,@Autowired(required=false)。
@Resource:默认按照名称进行装配,容许为null。
二者均可以写在字段和setter方法上,若是写在字段上,那么就不须要在写setter方法。
推荐使用@Resource注解在字段上,这样不只不须要写setter方法了,并且因为@Resource属于J2EE,下降与spring的耦合。