使用 Spring 開發(fā)時,進(jìn)行配置主要有兩種方式,一是 xml 的方式,二是 java config 的方式。Spring 技術(shù)自身也在不斷的發(fā)展和改變,從當(dāng)前 Springboot 的火熱程度來看,java config 的應(yīng)用是越來越廣泛了,在使用 java config 的過程當(dāng)中,我們不可避免的會有各種各樣的注解打交道,其中,我們使用最多的注解應(yīng)該就是 @Autowired 注解了。這個注解的功能就是為我們注入一個定義好的 bean。
@Autowired 這個注解我們經(jīng)常在使用,現(xiàn)在,我想問的是,它的作用到底是什么呢?
首先,我們從所屬范圍來看,事實上這個注解是屬于 Spring 的容器配置的一個注解,與它同屬容器配置的注解還有:@Required,@Primary, @Qualifier 等等。因此 @Autowired 注解是一個用于容器 ( container ) 配置的注解。
其次,我們可以直接從字面意思來看,@autowired 注解來源于英文單詞 autowire,這個單詞的意思是自動裝配的意思。自動裝配又是什么意思?這個詞語本來的意思是指的一些工業(yè)上的用機(jī)器代替人口,自動將一些需要完成的組裝任務(wù),或者別的一些任務(wù)完成。而在 Spring 的世界當(dāng)中,自動裝配指的就是使用將 Spring 容器中的 bean 自動的和我們需要這個 bean 的類組裝在一起。
在分析這個注解的實現(xiàn)原理之前,我們不妨先來回顧一下 @Autowired 注解的用法。
將 @Autowired 注解應(yīng)用于構(gòu)造函數(shù),如以下示例所示
public class MovieRecommender {
private final CustomerPreferenceDao customerPreferenceDao;
@Autowired
public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) {
this.customerPreferenceDao = customerPreferenceDao;
}
// ...
}
將 @Autowired 注解應(yīng)用于 setter 方法
public class SimpleMovieLister {
private MovieFinder movieFinder;
@Autowired
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
// ...
}
將 @Autowired 注解應(yīng)用于具有任意名稱和多個參數(shù)的方法
public class MovieRecommender {
private MovieCatalog movieCatalog;
private CustomerPreferenceDao customerPreferenceDao;
@Autowired
public void prepare(MovieCatalog movieCatalog,
CustomerPreferenceDao customerPreferenceDao) {
this.movieCatalog = movieCatalog;
this.customerPreferenceDao = customerPreferenceDao;
}
// ...
}
您也可以將 @Autowired 注解應(yīng)用于字段,或者將其與構(gòu)造函數(shù)混合,如以下示例所示
public class MovieRecommender {
private final CustomerPreferenceDao customerPreferenceDao;
@Autowired
private MovieCatalog movieCatalog;
@Autowired
public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) {
this.customerPreferenceDao = customerPreferenceDao;
}
// ...
}
直接應(yīng)用于字段是我們使用的最多的一種方式,但是使用構(gòu)造方法注入從代碼層面卻是更加好的。除此之外,還有以下不太常見的幾種方式
將 @Autowired 注解添加到需要該類型數(shù)組的字段或方法,則 Spring 會從 ApplicationContext 中搜尋符合指定類型的所有 bean,如以下示例所示:
public class MovieRecommender {
@Autowired
private MovieCatalog[] movieCatalogs;
// ...
}
數(shù)組可以,我們可以馬上舉一反三,那容器也可以嗎,答案是肯定的,下面是 set 以及 map 的例子:
public class MovieRecommender {
private Set<MovieCatalog> movieCatalogs;
@Autowired
public void setMovieCatalogs(Set<MovieCatalog> movieCatalogs) {
this.movieCatalogs = movieCatalogs;
}
// ...
}
public class MovieRecommender {
private Map<String, MovieCatalog> movieCatalogs;
@Autowired
public void setMovieCatalogs(Map<String, MovieCatalog> movieCatalogs) {
this.movieCatalogs = movieCatalogs;
}
// ...
}
以上就是 @Autowired 注解的主要使用方式,經(jīng)常使用 Spring 的話應(yīng)該對其中常用的幾種不會感到陌生。
更多建議: