zoukankan      html  css  js  c++  java
  • 注解@Resource与@Autowired的区别

    @Resource

    @Resource有两个常用属性name、type,所以分4种情况

    1. 指定name和type:通过name找到唯一的bean,找不到抛出异常;如果type和字段类型不一致,也会抛出异常
    2. 指定name:通过name找到唯一的bean,找不到抛出异常
    3. 指定type:通过tpye找到唯一的bean,如果不唯一,则抛出异常:NoUniqueBeanDefinitionException
    4. 都不指定:通过字段名作为key去查找,找到则赋值;找不到则再通过字段类型去查找,如果不唯一,则抛出异常:NoUniqueBeanDefinitionException
    5. 由J2EE提供,默认按照byName自动注入

    @Resource装配顺序:

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

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

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

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

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

    @Autowired

    @Autowired由Spring提供,只按照byType注入

    @Autowired只有一个属性required,默认值为true,为true时,找不到就抛异常,为false时,找不到就赋值为null

    @Autowired按类型查找,如果该类型的bean不唯一,则抛出异常;可通过组合注解解决@Autowired()@Qualifier("baseDao")

    相同点

    1. Spring都支持
    2. 都可以作用在字段和setter方法上

    不同点

    1. Resource是JDK提供的,而Autowired是Spring提供的
    2. Resource不允许找不到bean的情况,而Autowired允许(@Autowired(required = false)
    3. 指定name的方式不一样,@Resource(name = "baseDao"),@Autowired()@Qualifier("baseDao")
    4. Resource默认通过name查找,而Autowired默认通过type查找

    (1)@Autowired与@Resource都可以用来装配bean,都可以写在字段setter方法上

    (2)@Autowired默认按类型装配,默认情况下必须要求依赖对象存在,如果要允许null值,可以设置它的required属性false。如果想使用名称装配可以结合@Qualifier注解进行使用。

    (3)@Resource默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名进行名称查找。如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。

    推荐使用@Resource注解在字段上,这样就不用写setter方法了,并且这个注解是属于J2EE的,减少了与Spring的耦合。




    转自:https://www.jianshu.com/p/a74707581ffa
    转自:https://blog.csdn.net/balsamspear/article/details/87936936
  • 相关阅读:
    调用AsyncTask的excute方法不能立即执行程序的原因分析及改善方案
    辅助
    目录检索
    高斯消元法
    树套树
    珂朵莉树
    卢卡斯定理
    中国剩余定理
    数论基础
    网络流基础
  • 原文地址:https://www.cnblogs.com/dcrenl/p/13963402.html
Copyright © 2011-2022 走看看