暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

@Resource注解和@Autowired注解的区别

风济海 2021-07-14
354

今天,部门新来的实习生不了解@Resource注解和@Autowired注的区别,所以跟他讲了下,也顺便记录下。


一、这俩注解是干什么的?

@Resource注解和@Autowired注解都是用来实现依赖注入的。

二、这俩注解的相同点

@Resource注解和@Autowired注解都可以作用在成员变量和方法上。

三、这俩注解的不同点

1、@Resource

1.1 @Resource是JDK提供的注解,Spring支持通过该注解实现依赖注入。

1.2 @Resource有两个重要的属性:name和type,Spring把@Resource注解的name属性解析为bean的名字,通过byName的方式自动注入;Spring把type属性解析为bean的类型,通过byType的方式自动注入;默认情况下是按照byName的方式自动注入。

1.3 Spring针对@Resource解析过程:

  1. 如果设置了name,则从上下文中查找名称匹配的bean进行注入,找不到会抛出异常

  2. 如果设置了type,则从上下文中查找类型匹配的唯一bean进行注入,找不到或者找到多个,都会抛出异常。

  3. 如果同时设置了name和type,则从上下文中找到唯一匹配的bean进行注入,找不到会抛出异常

  4. 如果既没有设置name,又没有设置type,则自动按照byName方式进行注入;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动注入

       

1.4 代码示例

作用在成员变量上:

    public class XxxServiceImpl {
    @Resource(name="xxxDao")
    private XxxDao xxxDao;
    }
    复制


    作用在方法上:

      public class XxxServiceImpl {
      @Resource(name="xxxDao")
      public void setXxxDao(XxxDao xxxDao) {
      this.xxxDao = xxxDao;
      }
      }
      复制

      2、@Autowired

      2.1 @Autowired是Spring提供的注解,只能通过byType的方式自动注入。默认情况下它要求依赖对象必须存在,否则,可以设置它的required属性为false。

      作用在成员变量上:

        public class XxxServiceImpl {
        @Autowired
        private XxxDao xxxDao;
        }
        复制

        作用在方法上:

          public class XxxServiceImpl {
          @Autowired
          public void setXxxDao(XxxDao xxxDao) {
          this.xxxDao = xxxDao;
          }
          }
          复制

          2.2 如果想使用@Autowired按照byName的方式自动注入,需要结合@Qualifier注解(限定哪个bean应该被注入)一起使用,代码示例如下:

            public class XxxServiceImpl {
            @Autowired
            @Qualifier("xxxDao")
            private XxxDao xxxDao;
            }
            复制


            文章转载自风济海,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

            评论