目录:

1.@Resource与@Autowired的源码分析

2.@Resource与@Autowired的相同点

3.@Resource与@Autowired的不同点

正文:

1.@Resource与@Autowired的源码分析

  想要跟加深入的了解到这两个注解的不同,还要从他们的源码入手,首先来看看它们底层的源码实现:

  @Autowired的源码

 @Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
boolean required() default true;
}

  @Autowired的实例

@Controller
public class HappyController {
@Autowired //默认依赖的ClubDao 对象(Bean)必须存在
//@Autowired(required = false) 改变默认方式
@Qualifier("goodClubService")
private ClubService clubService; // Control the people entering the Club
// do something
}

  @Resource的源码

@Target({TYPE, FIELD, METHOD})
@Retention(RUNTIME)
public @interface Resource { String name() default ""; String lookup() default ""; Class<?> type() default java.lang.Object.class; ...
}

  @Resource的实例

public class AnotationExp {

    @Resource(name = "HappyClient")
private HappyClient happyClient; @Resource(type = HappyPlayAno .class)
private HappyPlayAno happyPlayAno;
}

  其中@AutoWired这个注解类中只有一个注解属性:required,这个注解属性代表了注入Bean的默认方式,如果不明确指定,其值为true。还要说明一下的是这个@AutoWired注解是Spring中的。

  而@Resource这个注解是JDK中的,它的注解属性有很多:name、lookup、type,这些注解属性的具体含义如下:

  源代码注解 翻译后
name
The JNDI name of the resource.  For field annotations,
the default is the field name. For method annotations,
the default is the JavaBeans property name corresponding
to the method. For class annotations, there is no default
and this must be specified.

资源的JNDI名称(对于属性而言)
默认的是字段名称。(对于方法而言)
默认的是属性的名称相对应的JavaBeans
的方法。如果类没有默认的annotations,
这必须是指定的。

lookup
The name of the resource that the reference points to. It can
link to any compatible resource using the global JNDI names.

引用指向的资源的名称。它可以
使用全局JNDI名称链接到任何兼容的资源。

type
The Java type of the resource.  For field annotations,
the default is the type of the field. For method annotations,
the default is the type of the JavaBeans property.
For class annotations, there is no default and this must be
specified.

资源的Java类型。字段注释,
默认值是字段的类型。对于方法注释,
默认值是JavaBeans属性的类型。
对于类注解,没有默认值,这必须是
明确规定。

  其中比较常用的是name和type属性,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。

2.@Resource与@Autowired的相同点

  @Resource的作用相当于@Autowired,均可标注在字段或属性的setter方法上。

3.@Resource与@Autowired的不同点

  @AutoWired @Resource
出处 Spring的注解 javax.annotation注解,而是来自于JSR-250,J2EE提供,需要JDK1.6及以上。 
注入方式 只按照Type 注入 默认按Name自动注入,也提供按照Type 注入
属性 @Autowired注解可用于为类的属性、构造器、方法进行注值。默认情况下,其依赖的对象必须存在(bean可用),如果需要改变这种默认方式,可以设置其required属性为false。 
还有一个比较重要的点就是,@Autowired注解默认按照类型装配,如果容器中包含多个同一类型的Bean,那么启动容器时会报找不到指定类型bean的异常,解决办法是结合@Qualified注解进行限定,指定注入的bean名称。 
@Resource有两个中重要的属性:name和type。name属性指定byName,如果没有指定name属性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。 
需要注意的是,@Resource如果没有指定name属性,并且按照默认的名称仍然找不到依赖对象时, @Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了。 

  注:@Resource注解的使用性更为灵活,可指定名称,也可以指定类型 ;@Autowired注解进行装配容易抛出异常,特别是装配的bean类型有多个的时候,而解决的办法是需要在增加@Qualitied进行限定。

java程序员的从0到1:@Resource与@Autowired的比较的更多相关文章

  1. java程序员的从0到1:统计某字符串在某文件中出现的次数(面试题)

    目录: 1. 编程题目 2. 方法一 3. 方法二 4. 方法三 5. 方法四 6. 总结 正文: 1. 编程题目 写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数. 2. ...

  2. Java 程序员技能导图 1.0

    做Java开发已经一年,并非科班出身,在毕业工作三年后毅然决然辞职,参加培训机构从零开始.在这期间迷茫.失望.绝望时常伴我左右,但是在不断自我提高与努力中渐渐看到一些小小的成果使我不断坚信自己的选择并 ...

  3. 0~5年一个Java程序员的晋升之路

    在程序界流行着一种默认的说法叫“黄金5年”,也就是一个程序员从入职的时候算起,前五年的选择直接影响着整个职业生涯中的职业发展方向和薪资走向,如何走好这5年,彻底从一个刚入行的菜鸟蜕变成可以以不变应万变 ...

  4. [转载]一个标准java程序员的进阶过程

    第一阶段:Java程序员 技术名称 内                 容 说明 Java语法基础 基本语法.数组.类.继承.多态.抽象类.接口.object对象.常用类(Math\Arrarys\S ...

  5. To Java程序员:切勿用普通for循环遍历LinkedList

    ArrayList与LinkedList的普通for循环遍历 对于大部分Java程序员朋友们来说,可能平时使用得最多的List就是ArrayList,对于ArrayList的遍历,一般用如下写法: p ...

  6. Java程序员岗位

    Java程序员岗位面试题有哪些?   1.面向对象的特征有哪些方面(1)抽象:抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择 ...

  7. 【转】java架构师之路:JAVA程序员必看的15本书的电子版下载地址

    作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从.我想就我自己读过的技术书籍中挑选出来一些,按照学习的先后顺序,推荐给大家,特别是那些想不断提高自己技术水 ...

  8. 谈谈Java程序员进阶的那些知识和方向

    谈谈Java程序员进阶的那些知识和方向 记得前段时间看过一篇文章谈到一种程序员叫野生程序员,战斗力极强,可以搞定一切问题,但是通常看问题抓不到本质,或者说是google/baidu/stackover ...

  9. Java程序员从笨鸟到菜鸟之(十三)java网络通信编程

    本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 首先声明一下,刚开始学习java网络通信编程就对他有一种畏惧感,因为自己对网络一窍不通,所 ...

随机推荐

  1. apache2不识别php

    sudo apt-get install libapache2-mod-php7.0 sudo a2enmod php7.0 sudo service apache2 restart 注意:Apach ...

  2. jQuery获取多种值的方法

    **jQuery 1.3.2版本下的 jquery radio取值,checkbox取值,select取值,radio选中,checkbox选中,select选中,及其相关设置** 1.判断是否已经打 ...

  3. webfrom 做项目的注意事项

    1.展示细节 如男女显示问题 不能显示true   false  时间转换成中文  民族显示汉字  不能直接显示代码2.用户名重复验证 从数据库中查询验证4.日期判断 判断年份有点问题   var y ...

  4. Executor线程池

    Executor线程池框架: 使用线程池的优点: 1.重用存在的线程 2.减少对象创建.消亡的开销 3.性能佳 4.可有效控制最大并发线程数,提高系统资源的使用率 5.避免过多资源竞争,避免堵塞 6. ...

  5. 算法Sedgewick第四版-第1章基础-2.1Elementary Sortss-002插入排序法(Insertion sort)

    一.介绍 1.时间和空间复杂度 运行过程 2.特点: (1)对于已排序或接近排好的数据,速度很快 (2)对于部分排好序的输入,速度快 二.代码 package algorithms.elementar ...

  6. Conda / Miniconda——软件包管理系统使用

    conda是一个非常好的python包管理软件,但是它的Minicoda是一个非常好的生信软件包管理软件,更多conda介绍多google. Miniconda简直就是生信人的福音,尤其是像我这种传统 ...

  7. ZROI #88

    传送门 分析 我们考虑把每个A[i]考虑为山峰的高度,每次的B考虑为海平面 于是我们知道对于A[i]和A[i-1],如果A[i-1]<A[i]则在A[i-1]<B<=A[i]时会使陆 ...

  8. A - Dictionary

    传送门 题目大意 给你n个字符串,问是否可以通过改变26个字母的排列顺序是这n个字符串的字典序是非降排列的. 分析 我们考虑设相邻两个字符串的第一个不相同字符的位置为j,以为要求字典序不降,所以有第i ...

  9. SQL Server相关知识和经验的碎片化记录

    1.在向服务器发送请求时发生传输级错误 在向服务器发送请求时发生传输级错误. (provider: TCP 提供程序, error: 0 - 远程主机强迫关闭了一个现有的连接.) ---> Sy ...

  10. android 6.0(23)的权限管理

    前言 谷歌在2015年8月份时候,发布了Android 6.0版本,代号叫做“棉花糖”(Marshmallow ),其中的很大的一部分变化,是在用户权限授权上,或许是感觉之前默认授权的不合理,现在6. ...