目录:

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. ks8基础(1) etcd安装

    下载安装 https://github.com/coreos/etcd/releases 在这网页,可以看到有多个版本共选择. 下载3.25 解压后, cd etcd-v3.2.5-linux-amd ...

  2. DAY10-MYSQL数据类型

    一 介绍 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的 详细参考: http://www.runoob.com/mysql/mysql-data ...

  3. dubbo-admin打包和zookper安装

    1 首选安装Zookper,下载zookeeper-3.5.3-beta版本,在这里我主要演示这个:下载地址:http://mirrors.hust.edu.cn/apache/zookeeper/ ...

  4. jquery datatable 多行(单行)选择(select),行获取/行删除

    jquery datatable 多行(单行)选择(select),行获取/行删除 代码展示 // 示例数据源 var dataSet = [ ['Tasman','Internet Explorer ...

  5. Ros学习——roslaunch

    roslaunch:启动定义在launch文件中的多个节点 1.launch文件解析 <launch> #以launch标签开头以表明这是一个launch文件 #两个节点分组并以'命名空间 ...

  6. cocos2dx帧动画

    //帧动画的创建 //方式一,通过多张图片来创建 auto sprite1 = Sprite::create("grossini_dance_05.png"); sprite1-& ...

  7. Vue02 样式的动态绑定

    daigengxin......2018-3-8 21:09:18 跟angular2类似,分为CSS类绑定和Style样式绑定两种方式,详情参见

  8. 客户注册功能,发短信功能分离 通过ActiveMQ实现

    客户注册功能,发短信功能分离 通过ActiveMQ 配置链接工厂, 配置session缓存工厂(引入链接工厂) 2.配置模板对象JmsTemplate 引入缓存工厂    指定消息模式(队列,发布和订 ...

  9. etl 获取列数据类型

    QueryInfo info = new QueryInfo(); info.CustomSQL = @" select column_name, data_type, data_preci ...

  10. C++面试笔记--字符串

    基本上求职者进行笔试没有不考字符串的.字符串也是一种相对简单的数据结构,容易被考.事实上,字符创也是一个考验程序猿编程规范和编程习惯的重要考点. 1.替换空格:实现一个函数,把字符串中的每个空格替换成 ...