对于最新的稳定版本,请使用 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 或组件类,容器通常预先知道具体类型。但是,对于@Beanfactory 方法,您需要以确保声明的返回类型具有足够的表现力。对于实现多个接口的组件或对于可能由其实现类型引用的组件,请考虑在工厂上声明最具体的返回类型方法(至少与引用 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或标准@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表示 corresponding 属性对于自动布线目的是可选的,并且该属性将是 如果无法自动连线,则忽略。这允许为属性分配默认值 可以选择通过依赖注入覆盖。spring-doc.cadn.net.cn

注入的构造函数和工厂方法参数是一种特例,因为required属性@Autowired由于 Spring 的构造函数,其含义有些不同 可能处理多个构造函数的解析算法。构造 函数 和工厂方法参数默认情况下是必需的,但有一些特殊的 单构造函数场景中的规则,例如多元素注入点(数组、 collections, maps)如果没有匹配的 bean 可用,则解析为空实例。这 允许一种通用的实现模式,其中所有依赖项都可以在 唯一的多参数构造函数 — 例如,声明为单个公共构造函数 没有@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) {
		...
	}
}

从 Spring Framework 5.0 开始,您还可以使用@Nullable注释(任何类型的在任何包中——例如,javax.annotation.Nullable从 JSR-305 开始),或者仅利用Kotlin 内置的空安全支持: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是 自动解析,无需特殊设置。以下示例自动布线 一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