Spring中Bean的理解

2024 年 9 月 23 日 星期一(已编辑)
2

Spring中Bean的理解

在 Spring 框架中,Bean 是一个核心概念,也是很多功能的基础。


1. 什么是 Spring 中的 Bean?

Bean 可以简单理解为由 Spring 容器管理的对象。在 Spring 应用中,所有你想让 Spring 帮你管理的对象都可以被称为 Bean。这些对象通常是你的应用程序中各种服务、数据访问对象(DAO)、控制器等。

通俗理解:

作为一个工厂的老板,工厂负责生产各种产品。可以让工人们按照某个标准生产产品,而自己不需要亲自去创建每一个产品。Spring 容器 就像这个工厂,它负责根据定义的标准(配置)来创建和管理对象(产品),这些对象就是 Bean

例子:

一个简单的类 Car,你想把它交给 Spring 容器管理。可以通过配置将 Car 定义为一个 Bean。

public class Car {
    private String model;

    public Car(String model) {
        this.model = model;
    }

    public void drive() {
        System.out.println("Driving a " + model);
    }
}

在 Spring 中,Bean 的定义可以通过两种方式:

  1. 基于 XML 的配置: 在 Spring 的 XML 配置文件中定义一个 Car Bean:

    <bean id="car" class="com.example.Car">
        <constructor-arg value="Toyota" />
    </bean>

    这里,Car 类被定义为一个 Bean,Spring 容器会在需要时创建这个 Car 对象。

  2. 基于注解的配置: 使用注解的方式来定义一个 Bean:

    @Component
    public class Car {
        private String model = "Toyota";
    
        public void drive() {
            System.out.println("Driving a " + model);
        }
    }

    然后在配置类中启用组件扫描:

    @Configuration
    @ComponentScan(basePackages = "com.example")
    public class AppConfig {
    }

    Spring 会自动扫描并创建 Car Bean。


2. 如何理解 Spring 中的 Bean?

1. Bean 是由 Spring 容器管理的对象

当告诉 Spring 容器应该如何创建一个对象(通过配置或注解),Spring 就会在运行时帮你创建并管理这个对象。这意味着不需要自己手动去创建这个对象,Spring 会在合适的时机提供。

2. Bean 是有生命周期的

Spring 容器管理 Bean 的整个生命周期,包括创建、初始化、销毁等过程。你只需要定义 Bean,Spring 会负责它的“出生”和“死亡”,并在合适的时机初始化或销毁它。

3. Bean 之间可以有依赖关系

Bean 可以依赖其他的 Bean,Spring 容器会自动处理这些依赖关系。例如,Car 可能依赖于 Engine,Spring 会自动将 Engine 注入到 Car 中。

public class Car {
    private Engine engine;

    @Autowired
    public Car(Engine engine) {
        this.engine = engine;
    }

    public void drive() {
        engine.start();
        System.out.println("Driving...");
    }
}
`Car` 需要 `Engine`,而 Spring 会自动将 `Engine` Bean 注入到 `Car` 中。

3. Spring Bean 的作用域(Scope)

作用域 指的是 Spring 容器如何管理 Bean 的生命周期和可见性。也就是说,Bean 在什么时候创建、被谁使用、被使用多久。这类似于现实生活中的产品生命周期:是一次性产品(只能用一次),还是长期服务的产品?

Spring 中的 Bean 作用域有几种常见类型:

1. Singleton(单例)[默认作用域]

这是最常用的作用域。单例作用域意味着 Spring 容器中每个 Bean 只有一个实例,无论在应用的不同地方请求多少次这个 Bean,Spring 都会返回同一个实例。

@Component
public class Car {
    // 默认是 Singleton
}
  • 什么时候用? 当想让某个 Bean 在整个应用程序中只有一个实例时使用,比如一个配置类或者服务类。

  • 特点

    • 只会创建一个实例。
    • 在多个地方调用时,返回的都是同一个对象。

2. Prototype(原型)作用域

Prototype 作用域意味着每次请求这个 Bean 时,Spring 都会创建一个新的实例。

@Component
@Scope("prototype")
public class Car {
    // 每次请求都会创建一个新的 Car 对象
}
  • 什么时候用? 当你需要每次获取 Bean 时都创建一个新实例的情况,比如某些状态需要频繁变化的对象。

  • 特点

    • 每次请求都会创建新的实例。
    • Spring 只负责创建对象,不管理其销毁。

3. Request 作用域(仅对 Web 应用有效)

Request 作用域是专门用于 Web 应用的作用域。它意味着在一次 HTTP 请求的生命周期内,Bean 会被创建并使用一次。当请求结束时,Bean 也会消失。

@Component
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class RequestScopedBean {
    // 仅在一个请求的生命周期内存在
}
  • 什么时候用? 当你希望某个 Bean 在每个 HTTP 请求中都是独立的,比如用户会话中的某些数据。

  • 特点

    • 每个 HTTP 请求期间创建一个新的实例。
    • 请求结束后,Bean 被销毁。

4. Session 作用域(仅对 Web 应用有效)

Session 作用域意味着在一个用户会话期间,Bean 会被创建并使用一次。只要用户的会话没有结束,Bean 就会存在。

@Component
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class SessionScopedBean {
    // 在用户会话期间存在
}
  • 什么时候用? 当你需要在用户会话期间保存某个对象的状态,比如购物车。

  • 特点

    • 每个用户会话期间创建一个实例。
    • 会话结束后,Bean 被销毁。

5. Application 作用域

Application 作用域意味着在整个 Web 应用程序的生命周期中,Bean 只会被创建一次,所有请求共享这个 Bean。

@Component
@Scope("application")
public class ApplicationScopedBean {
    // 在整个应用程序的生命周期内存在
}
  • 什么时候用? 当你希望某个 Bean 在整个应用程序中共享,并且只创建一次时使用。

  • 特点

    • 整个应用程序中只有一个实例。
    • 应用程序关闭时,Bean 才被销毁。

4. 总结与联系

  • Bean 是 Spring 容器管理的对象,Spring 负责它的创建、管理和销毁。
  • Bean 的作用域 定义了 Spring 如何管理这个对象的生命周期和实例的数量。
    • Singleton:全局单例,整个应用程序中只有一个实例。
    • Prototype:每次请求都会创建一个新的实例。
    • Request、Session、Application 作用域只适用于 Web 应用,分别对应于 HTTP 请求、用户会话和应用程序的生命周期。
  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...