好的,我来帮你系统梳理一下 Spring 中 Bean 的概念、作用及原理,让你对 Spring IoC 容器和 Bean 的理解更清晰。


Spring 学习之 Bean 的理解

1️⃣ Bean 的基本概念

在 Spring 框架中:

Bean 是由 Spring 容器管理的对象,即 IOC 容器中的组件实例

特点:

  • Spring 容器负责 Bean 的创建、初始化、依赖注入和生命周期管理。
  • Bean 是 Spring 管理的核心单位,通常对应一个业务对象或服务组件。

2️⃣ Bean 的作用

  1. 解耦
    • 业务对象无需自己实例化依赖对象,Spring 容器自动注入,提高模块化和可维护性。
  2. 生命周期管理
    • Spring 可以管理 Bean 的创建、初始化和销毁过程。
  3. 统一配置管理
    • Bean 的配置可以通过 XML、注解或 Java 配置统一管理。
  4. 支持依赖注入(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 环境)
websocketWebSocket 会话作用域(Spring 4+)

5️⃣ Bean 的生命周期

  1. 实例化(Instantiation)
    • Spring 容器通过反射创建 Bean 实例。
  2. 属性注入(Populate)
    • 将依赖对象注入 Bean 的属性。
  3. 初始化(Initialization)
    • 调用 InitializingBean.afterPropertiesSet() 或自定义 init-method
  4. 就绪使用
    • Bean 可被容器或业务代码使用。
  5. 销毁(Destroy)
    • 容器关闭时,调用 DisposableBean.destroy() 或自定义 destroy-method

注意:prototype 作用域 Bean 不会被容器管理销毁。


6️⃣ Bean 的底层原理

  1. BeanDefinition
    • 每个 Bean 在容器中都有一个 BeanDefinition,描述 Bean 的类、作用域、依赖关系等信息。
  2. BeanFactory / ApplicationContext
    • Spring 容器核心接口:
      • BeanFactory:最基本的容器,延迟初始化 Bean。
      • ApplicationContext:功能增强的容器,支持事件发布、AOP 等。
  3. 依赖注入原理
    • 通过 反射 + 依赖解析器(Dependency Resolver),将依赖对象注入 Bean 属性或构造函数。
  4. AOP 与 Bean
    • Spring 使用 代理模式(JDK 动态代理或 CGLIB)增强 Bean 功能,例如事务管理、日志记录。

7️⃣ 小结

  • Bean = 容器管理的对象
  • Bean 是 解耦、依赖注入、生命周期管理 的核心
  • 支持多种 声明方式:XML、注解、Java 配置
  • 作用域可控:单例、原型、Web 作用域
  • 生命周期包括 实例化 → 注入 → 初始化 → 使用 → 销毁
  • 底层原理依赖 BeanDefinition + 容器 + 反射 + 代理机制