Spring Bean 装配与配置详解
一、装配Bean
1. 什么是 Bean
在 Spring 中,Bean 是指由 IoC 容器管理的对象(即我们在开头示例中所列举的水)。IoC 容器负责创建、配置和管理这些对象的生命周期。每个 Bean 都是一个 Java 类的实例,通常被 Spring 容器实例化并进行配置。
2. Bean 装配的基本原理
装配 Bean 的过程,简而言之,就是 Spring 容器会根据配置(注解、XML、Java 配置等)自动创建对象,并将这些对象所依赖的其他对象(即它的依赖)注入给它。装配 Bean 的方式可以分为以下几种:自动装配和显式装配。
3. Bean 装配的核心原理
在 Spring 中,Bean 装配的原理可以通过以下几个关键步骤来理解:
I. 创建和注册 Bean
Spring IoC 容器会扫描类路径中的 @Component
注解类(如 @Service
、@Repository
、@Controller
等),或者根据 XML 配置文件和 Java 配置类中定义的 @Bean
配置,来创建 Bean 实例,并将其注册到 Spring 容器中。
II. 依赖注入
当容器创建一个 Bean 时,Spring 会自动注入该 Bean 所依赖的其他 Bean。依赖注入的过程是通过 反射 来实现的,Spring 会根据 Bean 的定义(如构造器、字段或 setter)来查找并注入依赖。
III. 依赖查找
当 Spring 容器实例化一个 Bean 时,它会查找该 Bean 所需要的依赖。
如果使用了 自动装配,Spring 会根据类型(或名称)来查找并注入依赖。
如果使用 显式装配,则会按照配置文件或配置类中提供的信息来注入依赖。
如果找不到匹配的依赖,Spring 会抛出异常,通常会在启动时发生(如:NoSuchBeanDefinitionException
)。
IV. 生命周期管理
Spring 容器不仅管理 Bean 的创建和依赖注入,还管理其生命周期。例如,容器会根据配置处理 Bean 的初始化、销毁等过程。你可以通过 @PostConstruct
和 @PreDestroy
注解来指定初始化和销毁方法。
4. Bean 装配的实例化顺序
Spring 在装配 Bean 时,会遵循一定的顺序:
- 扫描和实例化:容器扫描并实例化 Bean。
- 依赖注入:容器通过反射将依赖注入到 Bean 中。
- 初始化:容器调用
@PostConstruct
注解标注的方法,或者使用InitializingBean
接口的afterPropertiesSet()
方法进行初始化。 - 销毁:当容器关闭时,调用
@PreDestroy
注解标注的方法,或者使用DisposableBean
接口的destroy()
方法进行销毁。
5. 总结
装配 Bean 是 Spring 框架中 IoC(控制反转)和 DI(依赖注入)核心概念的实现。Spring 通过扫描、实例化和依赖注入的机制,自动或显式地将不同的 Bean 和它们的依赖关系连接起来,从而实现松耦合、灵活且可扩展的应用程序结构。通过这种方式,开发者可以专注于业务逻辑,而不必关心 Bean 的创建和管理。
二、创建第三方Bean
@Bean
用于显式地定义一个 Spring Bean。在 Spring 中,Bean 是由容器管理的对象,@Bean
注解用于在 Java 配置类中创建和注册 Bean,所以他会经常出现在@Configuration
所注册的配置类当中。
1. @Bean 基本用法
1.1 使用
@Bean
注解用于方法上,Spring 容器会通过该方法的返回值来创建 Bean,并将其注册到容器中。
示例
@Configuration
public class AppConfig {
@Bean
public MyService myService() {
return new MyServiceImpl();
}
}
在上面的例子中,@Bean
注解标记的方法 myService()
创建了一个 MyServiceImpl
实例,并将其作为 Bean 注册到 Spring 容器中。@Configuration
注解告诉 Spring 容器这个类是一个配置类,类中的 @Bean
方法会被作为 Bean 定义。
1.2 Bean 的作用域
通过 @Bean
定义的 Bean 默认为单例模式(singleton
),即整个 Spring 容器中只有一个实例。如果需要更改 Bean 的作用域,可以结合 @Scope
注解来实现。
@Bean
@Scope("prototype")
public MyService myService() {
return new MyServi