首页 > 其他分享 >Resource和Autowired区别

Resource和Autowired区别

时间:2022-08-26 09:14:48浏览次数:63  
标签:userDao name 区别 Autowired bean 注解 Resource

 使用场景:

  @Resource和@Autowired 都是做bean注入时使用

  @Resourece是JDK的注解,不是spring的注解;由包 javax.annotation.Resourece提供,需要导入;但是Spring支持该注解注入

相同和不同点:

  共同点:两者都可以写在setter方法,和字段上,不需要再写setter方法

  不同点:

      1: @Autowired是spring提供的注解,只按照byType注入

public class TestServiceImpl {
    // 下面两种@Autowired只要使用一种即可
    @Autowired
    private UserDao userDao; // 用于字段上
    
    @Autowired
    public void setUserDao(UserDao userDao) { // 用于属性的方法上
        this.userDao = userDao;
    }
}

    Autowired是按照类型byType装配依赖对象的,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置required 属性值为false.如果想按照名字(byName)来装配,可以结合Qualifier qualifier注解一起使用(通过类型匹配多个 candidate,在没有Qualifier的情况下,会使用对象名作为最后的fallback匹配)

public class TestServiceImpl {
    @Autowired
    @Qualifier("userDao")
    private UserDao userDao; 
}

      2:@Resource

      Resource默认是按照ByName自动注入的,@Resource有两个属性:name和 type; Spring将@Resource注解的name属性解析为bean的名字,而type

属性则解析为bean的类型,如果使用name属性,使用byName自动注入策略,而使用type属性时使用byType自动注入策略;如果即不指定name也不指定tyoe属性,这是将

反射机制使用byName自动注入策略

public class TestServiceImpl {
    // 下面两种@Resource只要使用一种即可
    @Resource(name="userDao")
    private UserDao userDao; // 用于字段上
    
    @Resource(name="userDao")
    public void setUserDao(UserDao userDao) { // 用于属性的setter方法上
        this.userDao = userDao;
    }
}

 

@Resource装配顺序

  1::如果同时指定name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛异常。

  2:如果指定了name,则从上下文中查找名字(id)匹配的bean进行装配,找不到则抛异常

  3:如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常

  4:如果即没有指定name,又没有指定type,则自动按照byName方式进行装配,如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配

  @Resource的作用哪个相当于@Autowired,只不过@Autowired 按照byType自动注入

  

在启动spring的时候,首先要启动容器:

启动spring容器时 ,会默认寻找容器扫描范围内的可加载bean,然后查找哪些bean上的属性和方法上有@Resource注解

找到@Resource注解后,判断@Resource注解括号中的name属性是否为空,

如果为空:看spring容器中的bean的id与@Resource要注解的那个变量属性名是否相同,

如相同,则匹配成功;如不相同,看spring容器中bean的id对应的类型是否与@Resource要注解 那个变量属性对应的类型是否相等,若相等,匹配成功,若不相等,匹配失败

如果@Resource注解括号中的name属性不为空,看name的属性值和容器中的bean的id名是否相等,如相等,则匹配成功;如不相等,则匹配失败

标签:userDao,name,区别,Autowired,bean,注解,Resource
From: https://www.cnblogs.com/liyanxi/p/16626385.html

相关文章

  • arduino自定义库c与c++的区别
    起初是想把手头的红牛开发板的基于stm32标准库的例子都改成用arduino库的   发现arduino库是基于hal库的 不是直接把c文件挪过来就能用的arduino是c++编译器 如......
  • 安卓buildscript和allprojects的作用和区别
    buildscript中的repositories和allprojects的repositories的作用和区别1、buildscript里是gradle脚本执行所需依赖,分别是对应的maven库和插件。在打包的时候,gradle会使用......
  • jack与jacky有什么区别
    jack与jacky有什么区别_百度知道 https://zhidao.baidu.com/question/407487746.html英语中如果别人把名字末尾加y是一种比较亲切的叫法,有时甚至会删减字母再加y,意思是......
  • go-redis和redigo连接池的区别
    go-redis是自动管理,类似go/sql包的方式,在真正执行的时候从连接池取一个连接,执行完毕后放回去,对调用者透明。调用者如果手动关闭连接,连接不能被复用,表现上看就是redis服务器......
  • euaka zookeeper nacos 的原理区别
    1.SpringCloudAlibaba微服务架构(十四)-Nacos集群部署原理解析https://thinkingcao.blog.csdn.net/article/details/1097764102.raft算法以及nacos中的实现  学习......
  • 接口和抽象类有什么区别
    接口和抽象类有什么区别你选择使用接口和抽象类的依据是什么?接口和抽象类的概念不一样。接口是对动作的抽象,抽象类是对根源的抽象。抽象类表示的是,这个对象是什么。......
  • python json用法 dump和dumps的区别;loads()和load()的区别
    json常用方法方法作用json.dumps()将python对象编码成Json字符串json.loads()将Json字符串解码成python对象json.dump()将python中的对象转化成json储存到......
  • C++中map,multimap和unordered_map的区别
    map、multimap容器map的所有元素都是pair,同时拥有键值(key)和实值(value)pair的第一元素被视为键值,第二元素被视为实值性质:以rb_tree为底层结构,因此元素有自动排序的特性,......
  • mysql 不可重复读与幻读的区别
    不可重复读的重点是修改:同样的条件,你读取过的数据,再次读取出来发现值不一样了幻读的重点在于新增或者删除同样的条件,第1次和第2次读出来的记录数不一样当然,从......
  • 加密流量TLS1.2 和TLS1.3的握手区别
    加密流量TLS1.2和TLS1.3的握手区别TLS1.2握手均是明文1)ClientHello2)ServerHello3)CertificateTLS1.3握手中ClientHello是明文,而ServerHello中Extensions以......