zoukankan      html  css  js  c++  java
  • @Resource、@Autowired、@Qualifier的注解注入及区别

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

    @Resource

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

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

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

    如果既不指定 name 属性又不指定 type 属性,Spring这时通过反射机制使用 byName 自动注入策略

    @Resource 的装配顺序

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

    @Autowried

    默认是按照类型进行装配注入,默认情况下,它要求依赖对象必须存在,如果允许 null 值,可以设置它 required 为false。

    如果我们想要按名称进行装配的话,可以添加一个 @Qualifier 注解解决。

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

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

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

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

    ①可能存在多个UserDao实例

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

    或者

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

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

  • 相关阅读:
    linux centos6.4 php连接sql server2008
    Windows下连接php5.3+sql server2008
    解决:安装SQl 2008为SQL Server代理服务提供的凭据无效
    Linux下查看文件夹或目录大小
    Sql 子查询
    Linux 删除空行
    shell中的IFS详解
    Linux 文件名匹配
    Linux Shell逻辑运算符和表达式详解
    转:shell 经典, shell 十三问
  • 原文地址:https://www.cnblogs.com/aoshicangqiong/p/10002721.html
Copyright © 2011-2022 走看看