此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Framework 6.2.0! |
用@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 开始, |
您还可以应用@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
// ...
}
确保您的目标组件(例如 对于通过 Classpath 扫描找到的 XML 定义的 bean 或组件类,容器
通常预先知道混凝土类型。但是,对于 |
你还可以指示 Spring 从ApplicationContext
通过添加@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 没有匹配的候选 bean 可用时,自动装配将失败 注射点。对于声明的数组、集合或 map,至少有一个 匹配元素。
默认行为是将带注释的方法和字段视为指示必需的
依赖。您可以更改此行为,如以下示例所示,
使框架能够跳过无法满足的注入点,方法是将其标记为
非必需的(即,通过设置required
属性@Autowired
自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
// ...
}
如果非必需方法的依赖项(或其 dependencies)不可用。非必填字段将 在这种情况下,根本不填充,保留其默认值。 换句话说,将 |
注入的构造函数和工厂方法参数是一种特殊情况,因为required
属性@Autowired
由于 Spring 的构造函数,其含义略有不同
Resolution 算法,该算法可能会处理多个构造函数。构造 函数
和工厂方法参数在默认情况下实际上是必需的,但有一些特殊的
单构造函数方案中的规则,例如多元素注入点(数组、
collections, map) 解析为空实例。这
允许使用通用的实现模式,其中所有依赖项都可以在
unique 多参数构造函数 — 例如,声明为单个公共构造函数
没有@Autowired
注解。
任何给定 bean 类只有一个构造函数可以声明 |
或者,您可以表示特定依赖项的非必需性质
通过 Java 8 的java.util.Optional
,如下例所示:
public class SimpleMovieLister {
@Autowired
public void setMovieFinder(Optional<MovieFinder> movieFinder) {
...
}
}
您还可以使用@Nullable
注解(任何软件包中的任何类型的 — 例如javax.annotation.Nullable
来自 JSR-305),或者只利用 Kotlin 内置的 null 安全
支持:
-
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
是
自动解析,无需特殊设置。以下示例 autowires
一ApplicationContext
对象:
-
Java
-
Kotlin
public class MovieRecommender {
@Autowired
private ApplicationContext context;
public MovieRecommender() {
}
// ...
}
class MovieRecommender {
@Autowired
lateinit var context: ApplicationContext
// ...
}
这 |