zoukankan      html  css  js  c++  java
  • spring @Resource与@Autowired注解详解

    具有依赖关系的Bean对象,利用下面任意一种注解都可以实现关系注入:
    1)@Resource (默认首先按名称匹配注入,然后类型匹配注入)
    2)@Autowired/@Qualifier (默认按类型匹配注入)

    注意:如果同一类型的bean有多个,又没有写@Qualifier,则会按照变量名匹配beanId注入
    3)@Inject/@Named

    注意:这三个没有任何区别,无任何限制,只是第三个要额外导包。

    对前两个进行区别如下:

    (1)@Resource(这个注解属于J2EE的)

     @Resource装配顺序

    1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
    2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
    3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
    4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为按类型进行匹配,如果匹配则自动装配;

    来看一个使用 @Resource 的例子:

    使用 @Resource 注释的 Test.java

    package com.test;

    import javax.annotation.Resource;

    public class Test{

      @Resource

      private Car car;

      @Resource(name="office")

      private Office office;

    }

    一般情况下,我们无需使用类似于 @Resource(type=Car.class) 的注释方式,因为 Bean 的类型信息可以通过 Java 反射从代码中获取。(即名字没匹配到,该注解自动会通过反射回退到按类型匹配,一般不需要写 @Resource(type=Car.class),写上就是指定按类型匹配,不会按名字匹配了

    (2)@Autowired(这个注解属于Spring的)

    @Autowired默认是按照byType进行注入的,但是当byType方式找到了多个符合的bean,又是怎么处理的?Autowired默认先按byType,如果发现找到多个bean,则又按照byName方式比对,如果还有多个,则报出异常。

    例子:
    @Autowired
    private Car redCar;
    1. spring先找类型为Car的bean
    2. 如果存在且唯一,则OK;
    3. 如果不唯一,在结果集里,寻找name为redCar的bean。因为bean的name有唯一性,所以,到这里应该能确定是否存在满足要求的bean了
    @Autowired也可以手动指定按照byName方式注入,使用@Qualifier标签,例如:
    @Autowired()
    @Qualifier("baseDao" )
    因为bean的name具有唯一性,理论上是byName会快一点,但spring 的@Autowired注解默认使用byType的方式注入。另外补充一点:@Resource(这个注解属于J2EE的)的标签,默认是按照byName方式注入的。

    转载:http://blog.csdn.net/wingbin/article/details/38385269

    转载:http://blog.csdn.net/zhangqun23/article/details/51398002

  • 相关阅读:
    c++虚函数
    Boost Graph Library
    二分查找 http://ac.jobdu.com/problem.php?pid=1545
    二叉树应用
    注解篇二
    springboot+fastdfs+docker
    注解篇一
    vue启动加修改例子
    SSM框架中的中文乱码问题
    mybatis4
  • 原文地址:https://www.cnblogs.com/cainiao-Shun666/p/8006247.html
Copyright © 2011-2022 走看看