您的位置:首页 > 其它

关于@autoWire与@resource的区别

2015-12-11 11:09 162 查看
首先@resource的范围比@autoWire的大

首先根据类型找到所有可以满足条件的bean

判断bean长度,如果没有,则根据@autowired中的required属性进行判断是否抛出异常(默认为true)

如果多于一个,则尝试寻找最优的那一个,如果最优的未找到,则抛出异常

如果只有一个,则直接使用此bean

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

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


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

@autowire
private String username;


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

获取element的名称,判断beanFactory是否存在此name的bean

如果存在,则直接使用此name进行查询

否则退化到默认的autowire查找方式

这里说是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中查找
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: