使用 @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 或透過類路徑掃描找到的元件類,容器通常預先知道具體型別。然而,對於 |
您還可以透過將 @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 可用時,自動裝配會失敗。對於宣告的陣列、集合或 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
// ...
}
如果非必需方法的依賴項(或多個引數的情況下,其依賴項之一)不可用,則該方法將完全不會被呼叫。在這種情況下,非必需欄位將完全不會被填充,保留其預設值。 換句話說,將 |
注入的建構函式和工廠方法引數是一種特殊情況,因為 Spring 的建構函式解析演算法可能處理多個建構函式,導致 @Autowired
中的 required
屬性具有一些不同的含義。建構函式和工廠方法引數預設實際上是必需的,但在單個建構函式場景中有一些特殊規則,例如多元素注入點(陣列、集合、map)在沒有匹配 bean 可用時解析為空例項。這允許一種常見的實現模式,其中所有依賴項都可以在唯一的多個引數建構函式中宣告——例如,宣告為一個沒有 @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
// ...
}
Spring Framework 6.2 尚不支援 JSpecify 等型別級別的 |
您還可以對眾所周知的可解析依賴介面使用 @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
// ...
}
|