在 Spring 框架中,Bean 的作用域具体划分成哪几种类型?
考察说明
考察对 Spring Bean 作用域类型及其适用场景的掌握程度。
回答思路
- 【回答框架 1】Spring 容器中的 Bean 作用域定义了 Bean 实例的创建范围和生命周期。核心作用域有五种:singleton、prototype、request、session 和 application。singleton 是默认作用域,容器中每个 Bean 定义对应一个实例,适合无状态或共享对象;prototype 每次获取都创建新实例,适合有状态且需要独立使用的对象。
- 【回答框架 2】request、session 和 application 作用域主要适用于 Web 应用环境。request 作用域每个 HTTP 请求创建一个实例;session 作用域每个 HTTP 会话共享一个实例;application 作用域在整个 ServletContext 生命周期内共享一个实例。除此之外,Spring 还支持自定义作用域,通过实现 Scope 接口并注册到容器来扩展。
- 【回答框架 3】在实际使用时,需要根据 Bean 的状态和共享需求选择作用域。无状态 Bean 常用 singleton 以节省资源,有状态 Bean 应根据并发和生命周期需求选择 prototype 或 Web 作用域。对于 Web 作用域的 Bean,注入到 singleton 或其他长生命周期 Bean 时需注意作用域代理配置,否则会抛出异常或无法正确获取实例。
- 【回答框架 4】选择作用域时还要考虑性能开销和线程安全。singleton 实例存在并发访问问题,需保证线程安全;prototype 每次创建带来创建和销毁开销,不适合频繁获取的场景。Web 作用域依赖 HTTP 环境,非 Web 应用使用会报错。
- 【关键点 1】Spring 提供五种核心 Bean 作用域:singleton、prototype、request、session、application。
- 【关键点 2】singleton 是默认作用域,容器内只创建一个实例,适合无状态 Bean。
- 【关键点 3】prototype 每次获取创建新实例,适合有状态且独立使用的对象。
- 【关键点 4】request、session、application 作用于 Web 环境,分别对应请求、会话和应用生命周期。
- 【关键点 5】可通过实现 Scope 接口自定义作用域,但需注册到容器中。
- 【易错点 1】混淆 singleton 保证线程安全,实际上需要开发者在 Bean 内部保证线程安全。
- 【易错点 2】在非 Web 应用或未配置 Web 环境时使用 request、session 作用域会抛出异常。
- 【易错点 3】将短生命周期作用域 Bean 注入到 singleton Bean 时,未使用作用域代理会导致获取到错误的实例。