一、@Autowired
1、出处:
Spring定义,只能在spring框架使用。
2、注解内部参数:只有一个
required:默认为true,此时对应的bean必须存在;若允许不存在可以@Autowired(required=false)。
3、装配方式及顺序:
默认按type自动装配,若发现多个bean,再按照name匹配,还有多个则报异常。支持@Primary。
注:多个bean支持注入到一个集合中,如:
@Autowired
List<Date> dates = Collections.emptyList();
4、应用范围:
构造方法、成员变量(字段)、方法(用在方法上时会自动执行该方法,若方法有参数会在IOC容器中自动寻找同类型参数为其传值)。
5、指定bean的名称:
@Bean("name")
@Component("name")
@Qualifier("name")
6、@autowired注入失败的情况
(1)描述:静态方法无法调用@autowired标注的成员变量(该变量为一个对象)。如:
public class CeErrorAlarm{
@autowired
private static CeAlarmDao ceAlarmDao;
public static ceErrorAlarm(){
ceAlarmDao.insert();
}
}
会报java.lang.NullPointerException: null异常。
(2)原因:spring注入是在容器中实例化对象,而静态方法是类方法。
(3)解决:@autowired不标注在静态变量上,而是在定义静态变量后,再写一个非静态方法,并用@autowired标注该方法,则该方法自动执行并为该方法的参数自动注入。然后在方法中将参数赋值给静态变量。此时可以在静态方法中调用该静态变量了。如:
public class CeErrorAlarm{
private static CeAlarmDao ceAlarmDao;
@autowired
public CeErrorAlarm(CeAlarmDao ceAlarmDao){
CeErrorAlarm.ceAlarmDao=ceAlarmDao;
}
public static ceErrorAlarm(){
ceAlarmDao.insert();
}
}
(@Value与此同理)
二、@Resource
1、出处:
jdk定义,可以与各种框架一起使用。
2、注解内部参数:包含七个参数
主要是name和type,分别表示bean的名称和类型,默认为“”和Object。不能配置”允许bean不存在“。
3、装配方式及顺序:
默认按name自动装配,若没有匹配再按照type;
若只指定了name则按name,只指定了type则按type;
若同时指定了name和type则匹配唯一bean。
不支持@Primary。
4、应用范围:
类、成员变量(字段)、方法。
5、指定bean的类型:
@Resource(type=Xxx.class)
三、@Qualifier
当自动注入时发现type和name都将相同时,可以使用@Qualifier指定要注入的bean。
1、直接用于bean上:
在有多个同类型bean时,只选择标了@Qualifier的bean。如:
@Bean
@Qualifier
public Date curDate(){
...
}
@Bean
public Date nextYear(){
...
}
@Autowired
@Qualifier
List<Date> dates = Collections.emptyList();
此时只会将curDate注入。
2、为bean标注别名:
@Bean
@Qualifier("nextYear")
public Date curDate(){
...
}
此时可以根据名称“nextYear”将curDate注入。
3、用于自定义注解上:
在自定义注解上使用@Qualifier注解,则该注解也具备了@Qualifier的功能,如:
自定义@QualifierDate注解:
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Qualifier
public @interface QualifierDate {
}
在bean上标注该自定义注解:
@Bean
@QualifierDate
public Date nextYear(){
Calendar ca = Calendar.getInstance();//得到一个Calendar的实例
ca.setTime(new Date()); //设置时间为当前时间
ca.add(Calendar.YEAR, +1); //年份+1
return ca.getTime();
}```
注入时再使用该自定义注解指定bean:
```java
@Autowired
@QualifierDate
List<Date> dates = Collections.emptyList();
四、@Primary
定义bean时使用@Primary定义首选项,只需要在注入Bean上添加@Primary定义首选项,那么该Bean就会作为首选进行注入。