在 Spring 中,Bean 的作用域用于定义 Bean 实例的生命周期和可见范围。Spring 支持以下五种 Bean 作用域:
- Singleton:单例模式,Spring 容器中只会创建一个 Bean 实例,所有对该 Bean 的请求都将返回同一个实例。默认的作用域为 Singleton。
- Prototype:原型模式,每次请求该 Bean 时,都会创建一个新的 Bean 实例。因此,该 Bean 的生命周期和请求周期相同。
- Request:每个 HTTP 请求都会创建一个新的 Bean 实例,该 Bean 的生命周期将与 HTTP 请求的生命周期相同。只有在 Web 应用程序上下文中才有意义。
- Session:每个 HTTP Session 都会创建一个新的 Bean 实例,该 Bean 的生命周期将与 HTTP Session 的生命周期相同。只有在 Web 应用程序上下文中才有意义。
- Global Session:该作用域仅适用于基于 Portlet 的 Web 应用程序,它表示 Portlet 应用程序的全局 Session 范围内创建 Bean 实例。只有在 Portlet 上下文中才有意义。
此外,还有一种特殊的作用域,即 Spring 4.2 引入的 Scope "Application"。该作用域类似于 Singleton,但作用域对象是 ServletContext 而不是 Spring 容器。
在 Spring 中,Bean 的类型也有多种,包括:
- POJO 类型的 Bean:通过配置文件或注解方式定义的简单 Java 对象。
- Factory Bean 类型的 Bean:实现了 FactoryBean 接口的 Bean,可以通过其 getObject() 方法返回一个其他类型的 Bean 实例。
- Abstract Bean 类型的 Bean:继承了 AbstractBeanDefinition 类的 Bean,可以自定义 Bean 的创建和销毁过程,例如:自定义属性注入和初始化方法的调用时机等。
- Inner Bean 类型的 Bean:在 Bean 的属性值中定义的一个 Bean,它的生命周期与外部 Bean 相关联,外部 Bean 销毁时内部 Bean 也会被销毁。
- Alias Bean 类型的 Bean:通过别名引用其他 Bean 实例的 Bean,通常用于简化配置文件中的 Bean 引用。