bean
在 Spring 框架中,Bean 是被 Spring IoC(Inversion of Control,控制反转)容器管理的对象。它是 Spring 应用中最核心的概念之一,理解 Bean 对于掌握 Spring 至关重要。
一、Bean 的核心含义
简单来说,Bean 就是由 Spring 容器创建、初始化、管理和销毁的 Java 对象。开发者不需要手动通过 new
关键字创建对象,而是通过配置或注解告诉 Spring 容器需要哪些对象,由容器负责对象的生命周期管理,包括依赖注入(DI,Dependency Injection)。
这种“由容器管理对象”的模式,正是 Spring 控制反转思想的体现:原本由开发者控制的对象创建和依赖管理过程,反转给了 Spring 容器。
二、Bean 的特点
由 Spring 容器管理
Bean 的创建、初始化、依赖注入、销毁等全生命周期由 Spring IoC 容器负责,开发者无需手动干预。单例默认
Spring 中 Bean 的默认作用域是 单例(Singleton),即容器中只会创建该 Bean 的一个实例,所有请求都共享这个实例。当然也可以通过配置修改作用域(如原型、请求、会话等)。依赖注入支持
Spring 容器会自动将 Bean 所需的依赖对象(其他 Bean)注入到当前 Bean 中,无需手动创建依赖对象,降低了代码耦合度。可配置性
开发者可以通过 XML 配置、注解或 Java 配置类定义 Bean 的创建规则、依赖关系、作用域等。
三、如何定义 Bean?
Spring 提供了多种方式定义 Bean,常见的有以下几种:
1. 基于注解定义 Bean(最常用)
通过在类上添加特定注解,告诉 Spring 容器这是一个需要管理的 Bean。常用注解包括:
@Component
:通用注解,标识一个普通的 Bean(适用于任何层)。@Service
:用于业务逻辑层(Service 层),是@Component
的特例。@Repository
:用于数据访问层(DAO 层),是@Component
的特例,还会自动处理数据库操作异常。@Controller
:用于 Web 层(如 Spring MVC 的控制器),是@Component
的特例。
示例:
@Service // 告诉 Spring 这是一个 Service 层的 Bean
public class AdminUserServiceImpl implements AdminUserService {
// 业务逻辑代码...
}
2. 基于 XML 配置定义 Bean(传统方式)
在 XML 配置文件中通过 <bean>
标签定义 Bean 的类、依赖等信息。
示例:
<!-- applicationContext.xml -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 定义一个 AdminUserService 的 Bean -->
<bean id="adminUserService" class="com.example.service.impl.AdminUserServiceImpl">
<!-- 依赖注入(如注入 Repository) -->
<property name="userRepository" ref="adminUserRepository"/>
</bean>
<!-- 定义 Repository 的 Bean -->
<bean id="adminUserRepository" class="com.example.repository.AdminUserRepository"/>
</beans>
3. 基于 Java 配置类定义 Bean
通过 @Configuration
注解标识配置类,再用 @Bean
注解在方法上定义 Bean,方法返回值即为 Bean 实例。
示例:
@Configuration // 标识这是一个配置类
public class AppConfig {
// 定义 AdminUserService 的 Bean
@Bean
public AdminUserService adminUserService() {
return new AdminUserServiceImpl(adminUserRepository()); // 手动注入依赖
}
// 定义 AdminUserRepository 的 Bean
@Bean
public AdminUserRepository adminUserRepository() {
return new AdminUserRepository();
}
}
四、Bean 的生命周期
Spring 容器对 Bean 的管理贯穿其完整生命周期,主要阶段包括:
- 实例化(Instantiation):容器通过反射创建 Bean 的实例(调用构造方法)。
- 属性注入(Population):容器将依赖的其他 Bean 或值注入到当前 Bean 的属性中(如
@Autowired
注入)。 - 初始化(Initialization):
- 调用
BeanNameAware
、BeanFactoryAware
等接口的回调方法(如果实现了这些接口)。 - 调用自定义的初始化方法(如通过
@PostConstruct
注解或 XML 中init-method
配置)。
- 调用
- 使用(In Use):Bean 处于可用状态,供应用程序调用。
- 销毁(Destruction):
- 容器关闭时,调用
DisposableBean
接口的回调方法(如果实现)。 - 调用自定义的销毁方法(如通过
@PreDestroy
注解或 XML 中destroy-method
配置)。
- 容器关闭时,调用
五、Bean 的作用域(Scope)
Bean 的作用域定义了容器中 Bean 实例的创建方式和存活范围,Spring 提供了多种作用域,常用的有:
- Singleton(单例):默认作用域,容器中只有一个 Bean 实例,所有请求共享该实例。
- Prototype(原型):每次请求 Bean 时,容器都会创建一个新的实例。
- Request(请求):Web 应用中,每个 HTTP 请求创建一个新实例,请求结束后销毁。
- Session(会话):Web 应用中,每个用户会话创建一个实例,会话结束后销毁。
示例:通过注解指定作用域
@Service
@Scope("prototype") // 原型作用域,每次获取都创建新实例
public class AdminUserServiceImpl implements AdminUserService {
// ...
}
六、总结
- Bean 是 Spring 容器管理的对象,是 Spring IoC 思想的具体体现。
- 通过注解(
@Component
、@Service
等)、XML 或 Java 配置类定义 Bean。 - 容器负责 Bean 的创建、依赖注入、生命周期管理,降低了代码耦合度。
- 理解 Bean 的概念和生命周期,是掌握 Spring 框架的基础。
在实际开发中,最常用的方式是通过注解(如 @Service
、@Repository
)定义 Bean,并结合 @Autowired
实现依赖注入。
本作品采用《CC 协议》,转载必须注明作者和本文链接