Spring @Autowired 注解

2021-08-17 14:28 更新

使用 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 注解的作用到底是什么?

@Autowired 這個注解我們經(jīng)常在使用,現(xiàn)在,我想問的是,它的作用到底是什么呢?

首先,我們從所屬范圍來看,事實上這個注解是屬于 Spring 的容器配置的一個注解,與它同屬容器配置的注解還有:@Required,@Primary, @Qualifier 等等。因此 @Autowired 注解是一個用于容器 ( container ) 配置的注解。

其次,我們可以直接從字面意思來看,@autowired 注解來源于英文單詞 autowire,這個單詞的意思是自動裝配的意思。自動裝配又是什么意思?這個詞語本來的意思是指的一些工業(yè)上的用機(jī)器代替人口,自動將一些需要完成的組裝任務(wù),或者別的一些任務(wù)完成。而在 Spring 的世界當(dāng)中,自動裝配指的就是使用將 Spring 容器中的 bean 自動的和我們需要這個 bean 的類組裝在一起。

@Autowired 注解用法

在分析這個注解的實現(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)該對其中常用的幾種不會感到陌生。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號