对于最新的稳定版本,请使用 Spring Framework 6.2.0spring-doc.cadn.net.cn

@Autowired

JSR 330 的@Inject注解可以代替 Spring 的@Autowired注解在 本节中包含的示例。有关更多详细信息,请参阅此处spring-doc.cadn.net.cn

您可以应用@Autowired注解添加到构造函数中,如下例所示:spring-doc.cadn.net.cn

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此类构造函数上的 annotation 不再是 如果目标 Bean 一开始只定义了一个构造函数,则为 necessary。但是,如果 有几个构造函数可用,至少没有主/默认构造函数 其中一个构造函数必须用@Autowired为了指示 container 使用哪一个。有关详细信息,请参阅有关构造函数解析的讨论。spring-doc.cadn.net.cn

您还可以应用@Autowired对传统 setter 方法的注释, 如下例所示:spring-doc.cadn.net.cn

public class SimpleMovieLister {

	private MovieFinder movieFinder;

	@Autowired
	public void setMovieFinder(MovieFinder movieFinder) {
		this.movieFinder = movieFinder;
	}

	// ...
}
class SimpleMovieLister {

	@set:Autowired
	lateinit var movieFinder: MovieFinder

	// ...

}

您还可以将注释应用于具有任意名称和多个 参数,如下例所示:spring-doc.cadn.net.cn

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添加到字段,甚至将其与构造函数混合使用,因为 以下示例显示:spring-doc.cadn.net.cn

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

	// ...
}

确保您的目标组件(例如MovieCatalogCustomerPreferenceDao) 始终由您用于@Autowired-注释 注射点。否则,注入可能会因运行时的 “no type match found” 错误而失败。spring-doc.cadn.net.cn

对于通过 Classpath 扫描找到的 XML 定义的 bean 或组件类,容器 通常预先知道混凝土类型。但是,对于@BeanFactory 方法,您需要 以确保 Declared 的 return 类型具有足够的表现力。对于组件 实现多个接口,或者对于可能由其 implementation 类型,请考虑在 Factory 上声明最具体的返回类型 方法(至少与引用 bean 的注入点所要求一样具体)。spring-doc.cadn.net.cn

从 4.3 开始,@Autowired还会考虑注入的自引用(即引用 返回到当前注入的 bean)。请注意,自注入是一种后备。 在实践中,您应该仅将自引用作为最后的手段(例如,对于 通过 Bean 的事务代理调用同一实例上的其他方法)。 在这种情况下,请考虑将受影响的方法分解为单独的委托 Bean。spring-doc.cadn.net.cn

你还可以指示 Spring 从ApplicationContext通过添加@Autowired对字段或方法的注释,该字段或方法 需要该类型的数组,如下例所示:spring-doc.cadn.net.cn

public class MovieRecommender {

	@Autowired
	private MovieCatalog[] movieCatalogs;

	// ...
}
class MovieRecommender {

	@Autowired
	private lateinit var movieCatalogs: Array<MovieCatalog>

	// ...
}

这同样适用于类型化集合,如下例所示:spring-doc.cadn.net.cn

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 可以实现org.springframework.core.Ordered接口或使用 这@Order或标准@Priorityannotation (如果您希望数组或列表中的项目) 以按特定顺序排序。否则,他们的顺序将遵循注册 容器中相应目标 bean 定义的顺序。spring-doc.cadn.net.cn

您可以声明@Order注解@Bean方法 可能对于单个 bean 定义(在多个定义的情况下, 使用相同的 bean 类)。@Order值可能会影响注入点的优先级, 但请注意,它们不会影响单例启动顺序,即 由依赖关系确定的正交关注点,以及@DependsOn声明。spring-doc.cadn.net.cn

请注意,@Order配置类上的注释只会影响评估 order 在启动时的整个配置类集中。此类配置级别 order 值不会影响包含的@Bean方法。对于 Bean 级排序, 每@Beanmethod 需要有自己的@Order注解,该注解在 特定 bean 类型的多个匹配项集(由工厂方法返回)。spring-doc.cadn.net.cn

请注意,标准jakarta.annotation.Priorityannotation 在@Beanlevel 的 LEVEL,因为它不能在方法上声明。它的语义可以建模 通过@Ordervalues 与@Primary在每种类型的单个 bean 上。spring-doc.cadn.net.cn

甚至打字Map只要预期的密钥类型为String. map 值包含预期类型的所有 bean,键包含 相应的 bean 名称,如下例所示:spring-doc.cadn.net.cn

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,至少有一个 匹配元素。spring-doc.cadn.net.cn

默认行为是将带注释的方法和字段视为指示必需的 依赖。您可以更改此行为,如以下示例所示, 使框架能够跳过无法满足的注入点,方法是将其标记为 非必需的(即,通过设置required属性@Autowiredfalse):spring-doc.cadn.net.cn

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)不可用。非必填字段将 在这种情况下,根本不填充,保留其默认值。spring-doc.cadn.net.cn

换句话说,将required属性设置为false表示 相应的属性对于自动装配目的是可选的,并且该属性将为 如果无法自动装配,则忽略。这允许为属性分配默认值 这可以通过依赖项注入选择性地覆盖。spring-doc.cadn.net.cn

注入的构造函数和工厂方法参数是一种特殊情况,因为required属性@Autowired由于 Spring 的构造函数,其含义略有不同 Resolution 算法,该算法可能会处理多个构造函数。构造 函数 和工厂方法参数在默认情况下实际上是必需的,但有一些特殊的 单构造函数方案中的规则,例如多元素注入点(数组、 collections, map) 解析为空实例。这 允许使用通用的实现模式,其中所有依赖项都可以在 unique 多参数构造函数 — 例如,声明为单个公共构造函数 没有@Autowired注解。spring-doc.cadn.net.cn

任何给定 bean 类只有一个构造函数可以声明@Autowired使用required属性设置为true,指示在用作 Spring 时要自动装配的构造函数 豆。因此,如果required属性保留为默认值true, 只能用@Autowired.如果多个构造函数 declare 注解,它们都必须声明required=false为了成为 被视为 autowiring 的候选者(类似于autowire=constructor在 XML 中)。 通过匹配可以满足的依赖项数量最多的构造函数 将选择 Spring 容器中的 bean。如果所有候选人都不能满足, 然后将使用 primary/default 构造函数(如果存在)。同样,如果类 声明了多个构造函数,但没有一个构造函数被注释@Autowired,然后是 primary/default 构造函数(如果存在)。如果一个类只声明一个 constructor 开头,它将始终被使用,即使没有注解。请注意, 带注释的构造函数不必是 public。spring-doc.cadn.net.cn

或者,您可以表示特定依赖项的非必需性质 通过 Java 8 的java.util.Optional,如下例所示:spring-doc.cadn.net.cn

public class SimpleMovieLister {

	@Autowired
	public void setMovieFinder(Optional<MovieFinder> movieFinder) {
		...
	}
}

从 Spring Framework 5.0 开始,您还可以使用@Nullable注释(任何类型的 在任何 package 中 — 例如,javax.annotation.Nullable来自 JSR-305)或只是利用 Kotlin 内置的 null 安全支持:spring-doc.cadn.net.cn

public class SimpleMovieLister {

	@Autowired
	public void setMovieFinder(@Nullable MovieFinder movieFinder) {
		...
	}
}
class SimpleMovieLister {

	@Autowired
	var movieFinder: MovieFinder? = null

	// ...
}

您还可以使用@Autowired对于众所周知的可解析接口 依赖:BeanFactory,ApplicationContext,Environment,ResourceLoader,ApplicationEventPublisherMessageSource.这些接口及其扩展 接口,例如ConfigurableApplicationContextResourcePatternResolver是 自动解析,无需特殊设置。以下示例 autowires 一ApplicationContext对象:spring-doc.cadn.net.cn

public class MovieRecommender {

	@Autowired
	private ApplicationContext context;

	public MovieRecommender() {
	}

	// ...
}
class MovieRecommender {

	@Autowired
	lateinit var context: ApplicationContext

	// ...
}

@Autowired,@Inject,@Value@ResourceComments 由 Spring 处理BeanPostProcessor实现。这意味着您无法应用这些注释 在你自己的BeanPostProcessorBeanFactoryPostProcessor类型 (如果有)。 这些类型必须使用 XML 或 Spring 显式地“连接”@Bean方法。spring-doc.cadn.net.cn