使用 @Autowired
JSR 330 的 |
您可以將 @Autowired
註解應用於建構子,如下列範例所示
-
Java
-
Kotlin
public class MovieRecommender {
private final CustomerPreferenceDao customerPreferenceDao;
@Autowired
public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) {
this.customerPreferenceDao = customerPreferenceDao;
}
// ...
}
class MovieRecommender @Autowired constructor(
private val customerPreferenceDao: CustomerPreferenceDao)
從 Spring Framework 4.3 開始,如果目標 Bean 只定義一個建構子,則不再需要在此類建構子上使用 |
您也可以將 @Autowired
註解應用於傳統 setter 方法,如下列範例所示
-
Java
-
Kotlin
public class SimpleMovieLister {
private MovieFinder movieFinder;
@Autowired
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
// ...
}
class SimpleMovieLister {
@set:Autowired
lateinit var movieFinder: MovieFinder
// ...
}
您也可以將註解應用於具有任意名稱和多個引數的方法,如下列範例所示
-
Java
-
Kotlin
public class MovieRecommender {
private MovieCatalog movieCatalog;
private CustomerPreferenceDao customerPreferenceDao;
@Autowired
public void prepare(MovieCatalog movieCatalog,
CustomerPreferenceDao customerPreferenceDao) {
this.movieCatalog = movieCatalog;
this.customerPreferenceDao = customerPreferenceDao;
}
// ...
}
class MovieRecommender {
private lateinit var movieCatalog: MovieCatalog
private lateinit var customerPreferenceDao: CustomerPreferenceDao
@Autowired
fun prepare(movieCatalog: MovieCatalog,
customerPreferenceDao: CustomerPreferenceDao) {
this.movieCatalog = movieCatalog
this.customerPreferenceDao = customerPreferenceDao
}
// ...
}
您可以將 @Autowired
應用於欄位,甚至可以將其與建構子混合使用,如下列範例所示
-
Java
-
Kotlin
public class MovieRecommender {
private final CustomerPreferenceDao customerPreferenceDao;
@Autowired
private MovieCatalog movieCatalog;
@Autowired
public MovieRecommender(CustomerPreferenceDao customerPreferenceDao) {
this.customerPreferenceDao = customerPreferenceDao;
}
// ...
}
class MovieRecommender @Autowired constructor(
private val customerPreferenceDao: CustomerPreferenceDao) {
@Autowired
private lateinit var movieCatalog: MovieCatalog
// ...
}
請確保您的目標元件(例如, 對於透過類別路徑掃描找到的 XML 定義 Bean 或元件類別,容器通常預先知道具體型別。但是,對於 |
您也可以指示 Spring 從 ApplicationContext
提供特定型別的所有 Bean,方法是將 @Autowired
註解新增到預期該型別陣列的欄位或方法,如下列範例所示
-
Java
-
Kotlin
public class MovieRecommender {
@Autowired
private MovieCatalog[] movieCatalogs;
// ...
}
class MovieRecommender {
@Autowired
private lateinit var movieCatalogs: Array<MovieCatalog>
// ...
}
這同樣適用於型別集合,如下列範例所示
-
Java
-
Kotlin
public class MovieRecommender {
private Set<MovieCatalog> movieCatalogs;
@Autowired
public void setMovieCatalogs(Set<MovieCatalog> movieCatalogs) {
this.movieCatalogs = movieCatalogs;
}
// ...
}
class MovieRecommender {
@Autowired
lateinit var movieCatalogs: Set<MovieCatalog>
// ...
}
如果希望陣列或列表中的項目以特定順序排序,您的目標 Bean 可以實作 您可以在目標類別層級和 請注意,組態類別上的 請注意,標準 |
即使是型別化的 Map
實例也可以自動裝配,只要預期的金鑰型別是 String
即可。Map 值包含預期型別的所有 Bean,而金鑰包含相應的 Bean 名稱,如下列範例所示
-
Java
-
Kotlin
public class MovieRecommender {
private Map<String, MovieCatalog> movieCatalogs;
@Autowired
public void setMovieCatalogs(Map<String, MovieCatalog> movieCatalogs) {
this.movieCatalogs = movieCatalogs;
}
// ...
}
class MovieRecommender {
@Autowired
lateinit var movieCatalogs: Map<String, MovieCatalog>
// ...
}
預設情況下,當給定的注入點沒有可用的匹配候選 Bean 時,自動裝配會失敗。在宣告的陣列、集合或 Map 的情況下,至少需要一個匹配元素。
預設行為是將註解方法和欄位視為指示必要的相依性。您可以變更此行為,如下列範例所示,透過將無法滿足的注入點標記為非必要(即,透過將 @Autowired
中的 required
屬性設定為 false
)來啟用框架跳過它
-
Java
-
Kotlin
public class SimpleMovieLister {
private MovieFinder movieFinder;
@Autowired(required = false)
public void setMovieFinder(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
// ...
}
class SimpleMovieLister {
@Autowired(required = false)
var movieFinder: MovieFinder? = null
// ...
}
如果非必要方法的相依性(或其相依性之一,在多個引數的情況下)不可用,則根本不會呼叫該方法。在這種情況下,非必要欄位根本不會被填入,而是保留其預設值。 換句話說,將 |
注入的建構子和工廠方法引數是一種特殊情況,因為 @Autowired
中的 required
屬性具有稍微不同的含義,這是因為 Spring 的建構子解析演算法可能會處理多個建構子。預設情況下,建構子和工廠方法引數實際上是必要的,但在單一建構子情境中,有一些特殊規則,例如,如果沒有可用的匹配 Bean,則多元素注入點(陣列、集合、Map)會解析為空實例。這允許一種常見的實作模式,其中所有相依性都可以在唯一的多引數建構子中宣告 – 例如,宣告為沒有 @Autowired
註解的單一公用建構子。
任何給定 Bean 類別的建構子中,只能有一個建構子可以宣告 |
或者,您可以透過 Java 8 的 java.util.Optional
來表示特定相依性的非必要性質,如下列範例所示
public class SimpleMovieLister {
@Autowired
public void setMovieFinder(Optional<MovieFinder> movieFinder) {
...
}
}
您也可以使用 @Nullable
註解(任何套件中的任何種類 – 例如,JSR-305 中的 javax.annotation.Nullable
),或僅利用 Kotlin 內建的空值安全支援
-
Java
-
Kotlin
public class SimpleMovieLister {
@Autowired
public void setMovieFinder(@Nullable MovieFinder movieFinder) {
...
}
}
class SimpleMovieLister {
@Autowired
var movieFinder: MovieFinder? = null
// ...
}
您也可以將 @Autowired
用於眾所周知的可解析相依性介面:BeanFactory
、ApplicationContext
、Environment
、ResourceLoader
、ApplicationEventPublisher
和 MessageSource
。這些介面及其擴充介面(例如 ConfigurableApplicationContext
或 ResourcePatternResolver
)會自動解析,無需任何特殊設定。下列範例自動裝配 ApplicationContext
物件
-
Java
-
Kotlin
public class MovieRecommender {
@Autowired
private ApplicationContext context;
public MovieRecommender() {
}
// ...
}
class MovieRecommender {
@Autowired
lateinit var context: ApplicationContext
// ...
}
|