zoukankan      html  css  js  c++  java
  • Spring 注释标签@Resource @Autowired 和@Inject的区别

    一些spring的开发人员在使用这三个标签进行注入的时候感到困惑。我来尝试解释一下这三个注解的主要区别。事实上,这三者非常相似,只存在一些微小的差别。在稍后的文章中会进行解释。

    1. @Resource-在javax.annotation包中定义
    2. @Inject-在javax.inject包中定义
    3. @Autowired-在org.springframework.bean.factory包中定义

    我们创建一个Car接口和两个实现类Volkswagen和Toyota.分别通过三种标签来注入来观察差异. 接口和类的定义如下.这里只提供了代码片段,如果你想运行这个例子,需要新建一个spring项目。

    示例:

    package com.dxz.beanregs;
         public interface Car {
    }
    package com.dxz.beanregs;
    
    import org.springframework.stereotype.Component;
    
    @Component
    public class Toyota implements Car {
    }
    
    package com.dxz.beanregs;
    
    import org.springframework.stereotype.Component;
    
    @Component
    public class Volkswagen implements Car {
    }

    Inject Interface

    @Resource
    private Car car;
    
    @Autowired
    private Car car;
    
    @Inject
    private Car car;

    下面是抛出的异常:
    Resource注解抛出:org.springframework.beans.factory.NoSuchBeanDefinitionException:
    Autowired注解抛出:No unique bean of type [javabeat.net.basics.Car] is defined:
    Inject注解抛出:expected single matching bean but found 2: [volkswagen, toyota]

    Field Type

    @Resource
    private Volkswagen car;
    
    @Autowired
    private Volkswagen car;
    
    @Inject
    private Volkswagen car;

    上面的代码工作的很好。 通过bean type,三个注解都注入了Volkswagen.

    Qualifier name

    @Resource
    @Qualifier("volkswagen")
    private Car car;
    
    @Autowired
    @Qualifier("volkswagen")
    private Car car;
    
    @Inject
    @Qualifier("volkswagen")
    private Car car;

    上面三个注解结合了@Qualifier将Volkswagen成功注入了。

    Conflicting Information

    @Resource
    @Qualifier("nkl")
    private Car volkswagen;
    
    @Autowired
    @Qualifier("nkl")
    private Car volkswagen;
    
    @Inject
    @Qualifier("nkl")
    private Car volkswagen;

    上面的代码,只有@Resource注入了Volkswagen类型.但是,@Autowired和@Injects都抛出了异常.
    Resource注解抛出:org.springframework.beans.factory.NoSuchBeanDefinitionException:
    Autowired注解抛出:No matching bean of type [javabeat.net.basics.Car] found for dependency:

    所以主要的区别是:@Autowired和@Inject无区别,这两个注解都是通过AutowiredAnnotationBeanPostProcessor来注入依赖。但是@Resource使用CommonAnnotationBeanPostProcessor来注入依赖。主要的区别是在检查的顺序上。

      • @Autowired and @Inject

        • 1.Matches by Type
        • 2.Restricts by Qualifiers
        • 3.Matches by Name
      • @Resource

        • 1.Matches by Name
        • 2.Matches by Type
        • 3.Restricts by Qualifiers (ignored if match is found by name)
  • 相关阅读:
    二进制插入 牛客网 程序员面试金典 C++ Python java
    二进制小数 牛客网 程序员面试金典 C++ Python
    二叉树中和为某一值的路径 牛客网 程序员面试金典 C++ Python
    Python matplotlib pylab 画张图
    Python matplotlib pylot和pylab的区别
    Ubuntu 16.04 curl 安装 使用
    Ubuntu 16.04 菜单栏 换位置 挪到左边 挪到下边
    Python 模块feedparser安装使用
    Ubuntu 16.04 下 旋转显示器屏幕 竖屏显示
    从 callback 到 promise
  • 原文地址:https://www.cnblogs.com/duanxz/p/4529710.html
Copyright © 2011-2022 走看看