首先@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中查找
时间: 2024-10-05 05:02:00