Springmvc注解@Resource和@Autowired区别对比

Springmvc注解@Resource和@Autowired区别对比Springmvc注解@Resource和@Autowired区别对比

大家好,又见面了,我是你们的朋友全栈君。

@Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。

1、共同点

两者都可以写在字段和setter方法上。两者如果都写在字段上,那么就不需要再写setter方法。

2、不同点

(1)@Autowired

@Autowired为Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired;只按照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注解一起使用。如下:

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

(2)@Resource

@Resource默认按照ByName自动注入,由J2EE提供,需要导入包javax.annotation.Resource。@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略。

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

注:最好是将@Resource放在setter方法上,因为这样更符合面向对象的思想,通过set、get去操作属性,而不是直接去操作属性。

@Resource装配顺序:

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

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

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

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

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

原文地址:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/105829.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • all in all是什么意思啊_22449.1000安装失败

    all in all是什么意思啊_22449.1000安装失败apache 无法启动 (98)Address already in use: AH00072 make_sock: could not bind to address 0.0.0.0:80…

    2022年4月20日
    50
  • 虚拟机CentOS系统没有UNIX2dos或dos2UNIX命令的解决方案(参考各路大佬后的总结)

    虚拟机CentOS系统没有UNIX2dos或dos2UNIX命令的解决方案(参考各路大佬后的总结)首先申明一下,只是本人在该问题上遇到的弯路,再通过查看各路大佬的方法总结出来的解决方法:因为是看到了这篇文章https://blog.csdn.net/w616589292/article/details/38274475,然后我就走上了我的弯路了,下载了hd2u-1.0.0.tgz还有popt-1.8-1.x86_64.rpm 配置好了一切发现没有一点卵用。然后我又看见了这篇文章http:/…

    2022年5月18日
    34
  • mysql之group_concat函数详解[通俗易懂]

    mysql之group_concat函数详解[通俗易懂]函数语法:group_concat([DISTINCT]要连接的字段[OrderBY排序字段ASC/DESC][Separator‘分隔符’])下面举例说明:selectid,pricefromgoods;以id分组,把price字段的值在同一行打印出来,逗号分隔(默认)selectid,group_concat(price…

    2022年6月13日
    54
  • pytest指定用例_白盒测试用例

    pytest指定用例_白盒测试用例前言测试用例在设计的时候,我们一般要求不要有先后顺序,用例是可以打乱了执行的,这样才能达到测试的效果.有些同学在写用例的时候,用例写了先后顺序,有先后顺序后,后面还会有新的问题(如:上个用例返回

    2022年7月29日
    7
  • html 行级元素和块级元素标签列表

    html 行级元素和块级元素标签列表一 显示元素 一 块级元素 div p h1 h6 form ul ol dl dt dd li table tr td th hr blockquote address table menu preHTML5 header section article footer 等块级元素独占一行 当没有设置宽高时 它默认设置为 100 其宽度自动填满其父元素宽度 块级元素允许设置宽高 widt

    2025年8月24日
    0
  • DOS命令:copy

    DOS命令:copycopy命令,将至少一个文件复制到另一个位置copy/?—查看官方帮助文档对COPYT的解释说明COPY[/D[1]][/V][/N][/Y|/-Y][/Z][/A|/B]source[/A|/B][+source[/A|/B][+…]][destination[/A|/B]]source指定要复制的文件。/A表示一个ASCII文本文件。/B表示一个二进位文件。/D允许解密要创建的目标文件dest…

    2022年7月18日
    17

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号