Spring注解解刨:不要在傻傻分不清楚
@Autowired注解
spring的注解
默认按类型装配,默认情况下必须要求依赖对象必须存在(不存在会报错),可以通过required=false属性设置非必须,如果我们想使用名称装配可以结合@Qualifier注解进行使用。
@Autowired(required = false)
private Date date;
@Autowired
@Qualifier("birth")
private Date birthday;
当系统中存在多个相同类型的Bean时,如果不使用@Qualified程序启动会报错。
@Bean
public Date d1(){
return new Date;
}
public Date d2(){
return new Date();
}
@Autowired
private Date date; // 会报错 required a single bean, but 2 found
@Resource javaEE注解
默认按名称进行装配,可以通过name属性指定名称,如果没有指定name属性,当注解写在字段上时,默认取字段名进行查找注入,如果写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就会值按照名称装配:
@Resource
private Date date; // 会报错 No qualifying bean of type 'java.util.Date'
因为我们没有以date为名称的bean,所以会按照类型注入,但是类型又有两个Date的bean,将date改成d1或者d2指明name属性
@Resource("d1")
private Date date;
@Qualifier
筛选注入对象
@Resource
@Qualifier
private List<Date> dates = Collections.emptyList();
直接使用@Qualifier, 起到一个筛选的作用,只有Bean上有@Qualifier注解的bean才会被收集注入