|
对于最新稳定版本,请使用Spring Framework 7.0.1! |
用@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对传统二传方法的注释,
如下示例所示:
-
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定义的豆子或组件类,容器
通常一开始就知道具体的混凝土类型。然而,对于 |
你也可以指示Spring提供所有特定类型的豆子应用上下文通过添加@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>
// ...
}
|
你的目标豆可以实现 你可以声明 注意标准 |
甚至打字地图只要预期的密钥类型为字符串.
映射值包含所有预期类型的豆子,键则包含
对应的Beans名称,如下示例所示:
-
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>
// ...
}
默认情况下,当某一矿井没有匹配的候选豆子时,自动接线会失败 注射点。对于声明的数组、集合或映射,至少有一个 匹配元素是预期的。
默认行为是将带注释的方法和字段视为必须的
依赖。你可以像下面的例子所示改变这种行为,
使框架能够跳过不可满足的注入点,通过标记为
非必需(即通过设置必填属性@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
// ...
}
|
如果非必需方法的依赖(或其其中一个)则不会被调用 在多个参数的情况下,依赖关系不可用。非必填字段则会 在这种情况下根本不会被填充,默认值保持原位。 换句话说,设置 |
注入构造函数和工厂方法参数是一个特例,因为必填属性@Autowired由于Spring的构造器,其含义略有不同
解析算法可能涉及多个构造函数。构造 函数
工厂方法参数默认是必需的,但有少数特殊参数
单构造器场景中的规则,如多元素注入点(数组,
集合,映射)如果没有匹配的豆子,则解析为空实例。这
允许一个统一的实现模式,使所有依赖都可以在
唯一的多参数构造器——例如,声明为单一公共构造器
没有@Autowired注解。
|
每个给定Beans中只有一个构造器可以声明 |
或者,你也可以表达某个依赖的非必需性质
通过 Java 8java.util.Optional,如下示例所示:
public class SimpleMovieLister {
@Autowired
public void setMovieFinder(Optional<MovieFinder> movieFinder) {
...
}
}
从 Spring Framework 5.0 开始,你还可以使用@Nullable注释(任何类型的)
在任何包中——例如,javax.annotation.Nullable或仅仅是杠杆
Kotlin 内置的零安全支持:
-
Java
-
Kotlin
public class SimpleMovieLister {
@Autowired
public void setMovieFinder(@Nullable MovieFinder movieFinder) {
...
}
}
class SimpleMovieLister {
@Autowired
var movieFinder: MovieFinder? = null
// ...
}
你也可以使用@Autowired对于已知且可解析的接口
依赖:豆子工厂,应用上下文,环境,ResourceLoader,应用事件发布者和消息源.这些接口及其扩展
接口,例如ConfigurableApplicationContext或资源模式解析器是
自动解决,无需特殊设置。以下示例是自动线路
一应用上下文对象:
-
Java
-
Kotlin
public class MovieRecommender {
@Autowired
private ApplicationContext context;
public MovieRecommender() {
}
// ...
}
class MovieRecommender {
@Autowired
lateinit var context: ApplicationContext
// ...
}
|
这 |