@Resource、@Autowired、@Qualifier的注解注入及区别

在Java代码中能够使用 @Resource  或者 @Autowired 注解方式来进行注入。 虽然 @Resource 和 @Autowried 均可以完成依赖注入,可是他们是有区别的java

@Resource

默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来注入。spring

它有两个属性是比较重要的:ui

  1. name: Spring 将 name 的属性值解析为 bean 的名称, 使用 byName 的自动注入策略
  2. type: Spring 将 type的属性值解析为 bean 的类型,使用 byType 的自动注入策略

若是既不指定 name 属性又不指定 type 属性,Spring这时经过反射机制使用 byName 自动注入策略this

@Resource 的装配顺序spa

  1. 若是同时指定了 name 属性和 type 属性,那么 Spring 将从容器中找惟一匹配的 bean 进行装配,找不到则抛出异常
  2. 若是指定了 name 属性值,则从容器中查找名称匹配的 bean 进行装配,找不到则抛出异常
  3. 若是指定了 type 属性值,则从容器中查找类型匹配的惟一的 bean 进行装配,找不到或者找到多个都会抛出异常
  4. 若是都不指定,则会自动按照 byName 方式进行装配, 若是没有匹配,则回退一个原始类型进行匹配,若是匹配则自动装配

@Autowried

默认是按照类型进行装配注入,默认状况下,它要求依赖对象必须存在,若是容许 null 值,能够设置它 required 为false。.net

若是咱们想要按名称进行装配的话,能够添加一个 @Qualifier 注解解决。code

@Autowried
@Qualifier("adminDAO")
private AdminDAO adminDAO;

@Resource 注解是 J2EE 提供的, 而 @Autowried 是 Spring 提供的,若是想减小对 Spring 的依赖建议使用 @Resource 方法。对象

@Resource 和 @Autowried 均可以加在字段的 setter 方法上。blog

@Autowired是根据类型进行自动装配的。若是当spring上下文中存在不止一个UserDao类型的bean时,就会抛出BeanCreationException异常;若是Spring上下文中不存在UserDao类型的bean,也会抛出BeanCreationException异常。咱们能够使用@Qualifier配合@Autowired来解决这些问题。以下代码所示:get

①可能存在多个UserDao实例

@Autowired   
@Qualifier("userServiceImpl")   
public IUserService userService;

或者

@Autowired   
public void setUserDao(@Qualifier("userDao") UserDao userDao) {   
    this.userDao = userDao;   
} 

这样Spring会直接找id为userServiceImpl和userDao的bean进行装配,从而解决多个bean形成的异常问题。

相关文章
相关标签/搜索