使用 @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。映射值包含所有预期类型的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 8的java.util.Optional表达特定依赖项的非必需性,如下例所示:
public class SimpleMovieLister {
@Autowired
public void setMovieFinder(Optional<MovieFinder> movieFinder) {
...
}
}
从Spring Framework 5.0开始,您还可以使用@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
// ...
}
|
|