此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10spring-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此类构造函数上的注释不再 如果目标 bean 一开始只定义了一个构造函数,则必需。但是,如果 有多个构造函数可用,并且至少没有主/默认构造函数 其中一个构造函数必须使用@Autowired为了指示 容器使用哪一个。有关详细信息,请参阅有关构造函数解析的讨论。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-注释 注射点。否则,注入可能会因运行时出现“未找到类型匹配”错误而失败。spring-doc.cadn.net.cn

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

自我注射

@Autowired还考虑注入的自引用(即,引用回 当前注入的 bean)。spring-doc.cadn.net.cn

但请注意,自注入是一种回退机制。对其他的定期依赖 组件始终具有优先级。从这个意义上说,自我引用不参与 常规的自动布线候选选择,因此特别不是主要的。上 相反,它们总是最终成为最低优先级。spring-doc.cadn.net.cn

在实践中,您应该仅将自我引用用作最后的手段——例如,对于 通过 Bean 的事务代理在同一实例上调用其他方法。作为 或者,考虑将受影响的方法分解到单独的委托 bean 这样的场景。spring-doc.cadn.net.cn

另一种选择是使用@Resource,这可能会获得一个代理,回到当前 bean 以其独特的名称。spring-doc.cadn.net.cn

尝试注入来自@Bean相同的方法@Configurationclass 是 实际上也是一个自我参考场景。要么延迟解析此类引用 在实际需要的方法签名中(而不是自动连线字段 )或声明受影响的@Bean方法static, 将它们与包含的配置类实例及其生命周期解耦。 否则,此类 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或标准@Priority注释(如果需要数组或列表中的项目) 按特定顺序排序。否则,他们的订单遵循注册 容器中相应目标 Bean 定义的顺序。spring-doc.cadn.net.cn

您可以声明@Order目标类级别的注释和@Bean方法 可能用于单个 Bean 定义(如果有多个定义 使用相同的 bean 类)。@Order值可能会影响进样点的优先级, 但请注意,它们不会影响单例启动顺序,这是一个 由依赖关系和@DependsOn声明。spring-doc.cadn.net.cn

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

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

甚至打字Map只要预期的键类型为String. 映射值包含预期类型的所有 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 没有匹配的可用时,自动装配将失败 注射点。对于声明的数组、集合或映射,至少一个 匹配元素。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 的构造函数解析算法可能处理多个构造函数,因此具有一些不同的含义。 构造 函数 默认情况下实际上需要工厂方法参数,但有一些特殊的规则,例如多元素注入点(数组、集合、映射)如果没有匹配的 bean 可用,则解析为空实例。 这 允许一种通用的实现模式,其中所有依赖项都可以在unique 多参数构造函数中声明——例如,声明为单个公共构造函数没有@Autowired注解。spring-doc.cadn.net.cn

任何给定 bean 类的只有一个构造函数可以声明@Autowired使用required属性设置为true指示构造函数在用作弹簧时要自动布线 豆。 因此,如果required属性保留为默认值true, 只能用@Autowired. 如果多个构造函数声明注释,则它们都必须声明required=false为了成为被视为自动布线的候选者(类似于autowire=constructor在 XML 中)。将选择具有最大依赖项数量的构造函数,可以通过匹配来满足Spring 容器中的 bean。如果没有一个候选者可以满足,则将使用主/默认构造函数(如果存在)。类似地,如果类声明了多个构造函数,但没有一个构造函数被@Autowired,则将使用primary/default 构造函数(如果存在)。如果一个类一开始只声明一个构造函数,则它将始终被使用,即使没有注释。请注意,一个annotated 构造函数不必是公共的。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) {
		...
	}
}

您还可以使用参数级别@Nullable注释(任何包中的任何类型——例如,javax.annotation.Nullable从 JSR-305 开始),或者仅利用 Kotlin 内置的null-safety 支持:spring-doc.cadn.net.cn

public class SimpleMovieLister {

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

	@Autowired
	var movieFinder: MovieFinder? = null

	// ...
}

类型级@NullableSpring 不支持 JSpecify 等注释框架 6.2。您需要升级到 Spring Framework 7.0,其中框架检测类型级注释并在自己的代码库中一致地声明 JSpecify。spring-doc.cadn.net.cn

您还可以使用@Autowired对于众所周知的可解析接口 依赖:BeanFactory,ApplicationContext,Environment,ResourceLoader,ApplicationEventPublisherMessageSource.这些接口及其扩展 接口,例如ConfigurableApplicationContextResourcePatternResolver是 自动解析,无需特殊设置。以下示例自动布线 一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@Resource注释由 Spring 处理BeanPostProcessor实现。这意味着您无法应用这些注释 在您自己的BeanPostProcessorBeanFactoryPostProcessor类型(如果有)。 这些类型必须使用 XML 或 Spring 显式“连接”。@Bean方法。spring-doc.cadn.net.cn