码迷,mamicode.com
首页 > 其他好文 > 详细

关于@autoWire与@resource的区别

时间:2015-12-11 11:23:31      阅读:486      评论:0      收藏:0      [点我收藏+]

标签:

首先@resource的范围比@autoWire的大

  1. 首先根据类型找到所有可以满足条件的bean
  2. 判断bean长度,如果没有,则根据@autowired中的required属性进行判断是否抛出异常(默认为true)
  3. 如果多于一个,则尝试寻找最优的那一个,如果最优的未找到,则抛出异常
  4. 如果只有一个,则直接使用此bean

如果@autoWire是在setter方法上标注的话,默认是按照参数名称而不是setter后面的属性名称进行注入,如果没有这个参数名称的话就按byType,以下是按tx1参数名称注入

public void setTx2(TxInterface tx1) {this.tx2 = tx1;}

如果autoWire标注在字段上面,则直接使用字段名称。进行查找,如

@autowire
private String username;

如果是按照@resource标注的话先会根据name进行匹配,如果匹配不到在退化成byType

  1. 获取element的名称,判断beanFactory是否存在此name的bean
  2. 如果存在,则直接使用此name进行查询
  3. 否则退化到默认的autowire查找方式
  4. 这里说是element的名称,因为它的来源有2个地方。一是在resouce注解中配置的name属性,第二就是setter名称或者是field名称(取决于@Resource的配置地点),这里说的是setter名称,而不是属性名称,这就是需要注意的地方

 

值得注意的是,如果在使用resource时,根据resource的name找到了bean,但该bean并不是所需要的bean类型,则就要报类型不 匹配错误了。即spring在查找时,并没有保证类型判断,即你配置一个name的tx2的bean,但该类型即为TxInterface2而不是 TxInterface,则spring在后期直接报异常,而不会fallback了。但Autowired注解则不会产生这种情况,因为它只会从满足 type的情况中的bean中查找

关于@autoWire与@resource的区别

标签:

原文地址:http://www.cnblogs.com/2027437606qq/p/5038394.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!