使用 @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)
|
如果目標 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
// ...
}
你可以將 @Autowired 應用於具有任意名稱和多個引數的方法,如以下示例所示
-
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 或透過類路徑掃描找到的元件類,容器通常會提前知道具體型別。但是,對於 |
你還可以透過將 @Autowired 註解新增到期望該型別陣列的欄位或方法中來指示 Spring 從 ApplicationContext 提供特定型別的所有 bean,如以下示例所示
-
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。對映值都是預期型別的 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 可用時,自動裝配會失敗。在宣告的陣列、集合或對映的情況下,期望至少有一個匹配元素。
預設行為是將註解方法和欄位視為指示必需依賴項。你可以更改此行為,如以下示例所示,透過將其標記為非必需(即,透過將 @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 可用時解析為空例項。這允許一種常見的實現模式,其中所有依賴項都可以在唯一的多個引數建構函式中宣告——例如,宣告為沒有 @Autowired 註解的單個公共建構函式。
|
任何給定 bean 類中只能有一個建構函式宣告 |
或者,你可以透過 Java 的 java.util.Optional 表達特定依賴項的非必需性質,如以下示例所示
public class SimpleMovieLister {
@Autowired
public void setMovieFinder(Optional<MovieFinder> movieFinder) {
...
}
}
你還可以使用引數級別的 @Nullable 註解(任何包中的任何型別——例如,JSpecify 中的 org.jspecify.annotations.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
// ...
}
|
這些型別必須透過使用 XML 或 Spring |