@Autowired默认是按照byType进行注入的,如果找到多个bean,再按照byName方式比对,如果还有多个,则报出异常。可配合@Qualifier注解指定bean。
例子
@Autowired
private BlogService blogService; // BlogService是一个接口
注入时步骤如下
1. spring先找类型为BlogService的bean
2. 如果存在且唯一,则OK;
3. 如果不唯一,在结果集里再寻找name为blogService的bean。找到唯一结果,OK;没有找到或者找到多个则抛出异常
稍作修改
@Autowired
@Qualifier("blogService")
private BlogService blogService;
那么只会去找名为blogService的bean了。这里的bean名字是接口实现类上注解@Service里的属性,如下
@Service("blogService")
public class BlogServiceImpl implements BlogService {}
@Autowired有个属性required,默认为true,要求注入的对象不能为空。若允许为空则设置为false。
@Resource默认按照ByName自动注入,由J2EE提供(javax.annotation.Resource)。@Resource有两个重要的属性:name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。
所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。