bean

在 Spring 框架中,Bean 是被 Spring IoC(Inversion of Control,控制反转)容器管理的对象。它是 Spring 应用中最核心的概念之一,理解 Bean 对于掌握 Spring 至关重要。

一、Bean 的核心含义

简单来说,Bean 就是由 Spring 容器创建、初始化、管理和销毁的 Java 对象。开发者不需要手动通过 new 关键字创建对象,而是通过配置或注解告诉 Spring 容器需要哪些对象,由容器负责对象的生命周期管理,包括依赖注入(DI,Dependency Injection)。

这种“由容器管理对象”的模式,正是 Spring 控制反转思想的体现:原本由开发者控制的对象创建和依赖管理过程,反转给了 Spring 容器。

二、Bean 的特点

  1. 由 Spring 容器管理
    Bean 的创建、初始化、依赖注入、销毁等全生命周期由 Spring IoC 容器负责,开发者无需手动干预。

  2. 单例默认
    Spring 中 Bean 的默认作用域是 单例(Singleton),即容器中只会创建该 Bean 的一个实例,所有请求都共享这个实例。当然也可以通过配置修改作用域(如原型、请求、会话等)。

  3. 依赖注入支持
    Spring 容器会自动将 Bean 所需的依赖对象(其他 Bean)注入到当前 Bean 中,无需手动创建依赖对象,降低了代码耦合度。

  4. 可配置性
    开发者可以通过 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 的管理贯穿其完整生命周期,主要阶段包括:

  1. 实例化(Instantiation):容器通过反射创建 Bean 的实例(调用构造方法)。
  2. 属性注入(Population):容器将依赖的其他 Bean 或值注入到当前 Bean 的属性中(如 @Autowired 注入)。
  3. 初始化(Initialization)
    • 调用 BeanNameAwareBeanFactoryAware 等接口的回调方法(如果实现了这些接口)。
    • 调用自定义的初始化方法(如通过 @PostConstruct 注解或 XML 中 init-method 配置)。
  4. 使用(In Use):Bean 处于可用状态,供应用程序调用。
  5. 销毁(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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!