基本概念:@Bean@Configuration

Spring的Java配置支持中的核心组件是使用@Configuration注解的类和使用@Bean注解的方法。

@Bean注解用于指示一个方法实例化、配置和初始化一个新对象,该对象将由Spring IoC容器管理。对于熟悉Spring的<beans/> XML配置的人来说,@Bean注解扮演的角色与<bean/>元素相同。您可以在任何Spring @Component中使用@Bean注解的方法。但是,它们通常与@Configuration bean一起使用。

使用@Configuration对类进行注解表示其主要目的是作为bean定义的来源。此外,@Configuration类允许通过调用同一类中的其他@Bean方法来定义bean之间的依赖关系。最简单的@Configuration类如下所示:

  • Java

  • Kotlin

@Configuration
public class AppConfig {

	@Bean
	public MyServiceImpl myService() {
		return new MyServiceImpl();
	}
}
@Configuration
class AppConfig {

	@Bean
	fun myService(): MyServiceImpl {
		return MyServiceImpl()
	}
}

上述的AppConfig类等同于以下Spring的<beans/> XML:

<beans>
	<bean id="myService" class="com.acme.services.MyServiceImpl"/>
</beans>
完整的@Configuration与“精简”@Bean模式有何不同?

当在未使用@Configuration注解的类中声明@Bean方法时,它们被称为以“精简”模式处理。在未使用@Configuration注解的bean上声明的bean方法被认为是“精简”的,其包含类的主要目的不同,@Bean方法只是一种额外的奖励。例如,服务组件可以通过每个适用组件类上的额外@Bean方法向容器公开管理视图。在这种情况下,@Bean方法是一种通用的工厂方法机制。

与完整的@Configuration不同,精简的@Bean方法不能声明bean之间的依赖关系。相反,它们操作其包含组件的内部状态,并且可以选择地操作它们可能声明的参数。因此,这样的@Bean方法不应调用其他@Bean方法。每个这样的方法实际上只是一个特定bean引用的工厂方法,没有任何特殊的运行时语义。这里的积极副作用是在运行时不需要应用CGLIB子类化,因此在类设计方面没有限制(即,包含类可以是final等)。

在常见情况下,应该在@Configuration类中声明@Bean方法,确保始终使用“完整”模式,因此跨方法引用将被重定向到容器的生命周期管理。这可以防止相同的@Bean方法在通过常规Java调用时被意外调用,有助于减少在“精简”模式下操作时难以跟踪的细微错误。

@Bean@Configuration注解将在以下章节中进行详细讨论。但首先,我们将介绍使用基于Java的配置创建Spring容器的各种方法。