对于最新稳定版本,请使用Spring Framework 7.0.1spring-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对此类构造子的注释不再是 如果目标豆一开始只定义一个构造子,则是必要的。然而,如果 有多个构造器可用,至少没有主/默认构造器 其中一个构造子必须注释为@Autowired以指导 选用哪个容器。详情请参见关于构造器解析的讨论。spring-doc.cadn.net.cn

你也可以应用@Autowired传统二传方法的注释, 如下示例所示: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

	// ...
}

确保你的目标组件(例如,电影目录CustomerPreferenceDao) 始终由你用于@Autowired-注释 注射点。否则,注入可能因运行时出现“未找到类型匹配”错误而失败。spring-doc.cadn.net.cn

对于通过类路径扫描找到的XML定义的豆子或组件类,容器 通常一开始就知道具体的混凝土类型。然而,对于@Bean工厂方法,你需要 以确保声明的返回类型足够表达。对于组成部分 实现多个接口或为可能指的组件的 实现类型,考虑在工厂上申报最具体的退货类型 方法(至少要根据注射点指的是你的豆子)。spring-doc.cadn.net.cn

你也可以指示Spring提供所有特定类型的豆子应用上下文通过添加@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>

	// ...
}

你的目标豆可以实现org.springframework.core.Ordered接口或用途 这@Order或标准@Priority如果你想在数组或列表中添加注解 按特定顺序排序。否则,顺序跟随注册 容器中对应的目标豆定义顺序。spring-doc.cadn.net.cn

你可以声明@Order目标类级别及以上的注释@Bean方法 对于单个Beans定义(在多个定义情况下,可能 使用同一个Beans)。@Order值可能会影响注入点的优先级, 但请注意,它们不会影响单例启动顺序,而单例启动顺序是 由依存关系确定的正交关注点和@DependsOn声明。spring-doc.cadn.net.cn

注意标准jakarta.annotation.优先级注释不提供于@Bean层级,因为它不能在方法上声明。其语义可以被建模 通过@Order值与@Primary每种豆子都用一颗豆子。spring-doc.cadn.net.cn

甚至打字地图只要预期的密钥类型为字符串. 映射值包含所有预期类型的豆子,键则包含 对应的Beans名称,如下示例所示: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>

	// ...
}

默认情况下,当某一矿井没有匹配的候选豆子时,自动接线会失败 注射点。对于声明的数组、集合或映射,至少有一个 匹配元素是预期的。spring-doc.cadn.net.cn

默认行为是将带注释的方法和字段视为必须的 依赖。你可以像下面的例子所示改变这种行为, 使框架能够跳过不可满足的注入点,通过标记为 非必需(即通过设置必填属性@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

	// ...
}

如果非必需方法的依赖(或其其中一个)则不会被调用 在多个参数的情况下,依赖关系不可用。非必填字段则会 在这种情况下根本不会被填充,默认值保持原位。spring-doc.cadn.net.cn

换句话说,设置必填归属为false表示 对应的属性在自布线时是可选的,该属性将为 如果不能自动接线,就忽略它。这允许属性被赋予默认值 该功能可通过依赖注入选择性覆盖。spring-doc.cadn.net.cn

注入构造函数和工厂方法参数是一个特例,因为必填属性@Autowired由于Spring的构造器,其含义略有不同 解析算法可能涉及多个构造函数。构造 函数 工厂方法参数默认是必需的,但有少数特殊参数 单构造器场景中的规则,如多元素注入点(数组, 集合,映射)如果没有匹配的豆子,则解析为空实例。这 允许一个统一的实现模式,使所有依赖都可以在 唯一的多参数构造器——例如,声明为单一公共构造器 没有@Autowired注解。spring-doc.cadn.net.cn

每个给定Beans中只有一个构造器可以声明@Autowired其中必填属性设置为true表示构造器作为Spring使用时将自动接线 豆。因此,如果必填属性保持默认值true, 只能对单个构造子进行注释,记载为@Autowired.如果有多个构造子 声明注释,它们都必须声明required=false为了成为 被视为自动接线的候选对象(类似于autowire=构造者以XML形式)。 通过匹配满足最多依赖的构造函数 春季容器中的豆子将被选中。如果没有任何候选人能满足, 然后使用主构造/默认构造函数(如果存在的话)。同理,如果 有 声明多个构造子,但没有一个被注释为@Autowired,然后 主/默认构造函数(如果存在)将被使用。如果一个类只声明一个 首先,即使没有注释,它也会一直被使用。注意 带注释的构造器不必是公开的。spring-doc.cadn.net.cn

或者,你也可以表达某个依赖的非必需性质 通过 Java 8java.util.Optional,如下示例所示:spring-doc.cadn.net.cn

public class SimpleMovieLister {

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

从 Spring Framework 5.0 开始,你还可以使用@Nullable注释(任何类型的) 在任何包中——例如,javax.annotation.Nullable或仅仅是杠杆 Kotlin 内置的零安全支持:spring-doc.cadn.net.cn

public class SimpleMovieLister {

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

	@Autowired
	var movieFinder: MovieFinder? = null

	// ...
}

你也可以使用@Autowired对于已知且可解析的接口 依赖:豆子工厂,应用上下文,环境,ResourceLoader,应用事件发布者消息源.这些接口及其扩展 接口,例如ConfigurableApplicationContext资源模式解析器是 自动解决,无需特殊设置。以下示例是自动线路 一应用上下文对象:spring-doc.cadn.net.cn

public class MovieRecommender {

	@Autowired
	private ApplicationContext context;

	public MovieRecommender() {
	}

	// ...
}
class MovieRecommender {

	@Autowired
	lateinit var context: ApplicationContext

	// ...
}

@Autowired,@Inject,@Value@Resource注释由 Spring 处理豆子后处理器实现。这意味着你不能应用这些注释 在你自己的世界里豆子后处理器豆工厂后处理类型(如果有的话)。 这些类型必须通过XML或Spring显式“接线”完成@Bean方法。spring-doc.cadn.net.cn