好的,我来帮你系统梳理一下 Spring 中 Bean 的概念、作用及原理,让你对 Spring IoC 容器和 Bean 的理解更清晰。
Spring 学习之 Bean 的理解
1️⃣ Bean 的基本概念
在 Spring 框架中:
Bean 是由 Spring 容器管理的对象,即 IOC 容器中的组件实例。
特点:
- Spring 容器负责 Bean 的创建、初始化、依赖注入和生命周期管理。
- Bean 是 Spring 管理的核心单位,通常对应一个业务对象或服务组件。
2️⃣ Bean 的作用
- 解耦
- 业务对象无需自己实例化依赖对象,Spring 容器自动注入,提高模块化和可维护性。
- 生命周期管理
- Spring 可以管理 Bean 的创建、初始化和销毁过程。
- 统一配置管理
- Bean 的配置可以通过 XML、注解或 Java 配置统一管理。
- 支持依赖注入(DI)
- 自动装配依赖对象,无需在代码中手动创建。
3️⃣ Bean 的定义方式
3.1 XML 配置方式
<bean id="userService" class="com.example.service.UserService">
<property name="userDao" ref="userDao"/>
</bean>
<bean id="userDao" class="com.example.dao.UserDao"/>
3.2 注解方式(推荐)
// Bean 声明
@Component
public class UserService {
@Autowired
private UserDao userDao;
}
// Dao 声明
@Repository
public class UserDao {}
- Spring 扫描带
@Component
、@Service
、@Repository
、@Controller
的类,并注册为 Bean。
3.3 Java 配置方式
@Configuration
public class AppConfig {
@Bean
public UserService userService() {
return new UserService(userDao());
}
@Bean
public UserDao userDao() {
return new UserDao();
}
}
4️⃣ Bean 的作用域(Scope)
Spring Bean 默认是 单例(Singleton),但也可配置不同作用域:
作用域 | 说明 |
---|---|
singleton | 单例(默认),IOC 容器中只有一个实例 |
prototype | 多例,每次获取 Bean 都创建新实例 |
request | 每次 HTTP 请求创建一个 Bean(Web 环境) |
session | 每个 HTTP Session 创建一个 Bean(Web 环境) |
application | 一个 ServletContext 中共享 Bean(Web 环境) |
websocket | WebSocket 会话作用域(Spring 4+) |
5️⃣ Bean 的生命周期
- 实例化(Instantiation)
- Spring 容器通过反射创建 Bean 实例。
- 属性注入(Populate)
- 将依赖对象注入 Bean 的属性。
- 初始化(Initialization)
- 调用
InitializingBean.afterPropertiesSet()
或自定义init-method
。
- 调用
- 就绪使用
- Bean 可被容器或业务代码使用。
- 销毁(Destroy)
- 容器关闭时,调用
DisposableBean.destroy()
或自定义destroy-method
。
- 容器关闭时,调用
注意:
prototype
作用域 Bean 不会被容器管理销毁。
6️⃣ Bean 的底层原理
- BeanDefinition
- 每个 Bean 在容器中都有一个 BeanDefinition,描述 Bean 的类、作用域、依赖关系等信息。
- BeanFactory / ApplicationContext
- Spring 容器核心接口:
BeanFactory
:最基本的容器,延迟初始化 Bean。ApplicationContext
:功能增强的容器,支持事件发布、AOP 等。
- Spring 容器核心接口:
- 依赖注入原理
- 通过 反射 + 依赖解析器(Dependency Resolver),将依赖对象注入 Bean 属性或构造函数。
- AOP 与 Bean
- Spring 使用 代理模式(JDK 动态代理或 CGLIB)增强 Bean 功能,例如事务管理、日志记录。
7️⃣ 小结
- Bean = 容器管理的对象
- Bean 是 解耦、依赖注入、生命周期管理 的核心
- 支持多种 声明方式:XML、注解、Java 配置
- 作用域可控:单例、原型、Web 作用域
- 生命周期包括 实例化 → 注入 → 初始化 → 使用 → 销毁
- 底层原理依赖 BeanDefinition + 容器 + 反射 + 代理机制
发表回复