一、Spring Bean 作用域Bean 作用域用于控制 Bean 实例的创建规则、数量及存活范围Spring 官方提供 5 种核心作用域默认作用域为singleton单例。1. singleton单例默认整个 Spring IoC 容器中仅会创建一个 Bean 实例全局所有调用、注入场景都会复用该实例Bean 的创建与销毁均由 Spring 容器统一管理。核心注意点单例 Bean非线程安全多线程并发场景下禁止在 Bean 中定义成员变量存储业务数据避免数据错乱问题。适用场景无状态业务 Bean如 Service、Dao、工具类、配置类等。2. prototype原型每次通过容器获取 Bean、依赖注入 Bean 时都会创建一个全新的实例。与单例模式最大的区别是Spring 容器只负责创建原型 Bean不管理其销毁资源释放需要开发者手动处理。适用场景有状态、需要独立实例的业务场景多线程专属 Bean。3. request请求作用域仅适用于 Web 开发环境。每一次 HTTP 请求都会创建一个全新的 Bean请求处理结束后该 Bean 会自动销毁。4. session会话作用域仅适用于 Web 开发环境。对应单个用户的浏览器会话同一个用户的多次请求共享一个 Bean当用户会话超时、主动退出或关闭页面时Bean 随之销毁。适用场景存储用户登录信息、临时购物车数据等用户专属数据。5. application应用作用域仅适用于 Web 开发环境。整个 Web 应用生命周期内只存在一个 Bean作用域范围等同于 ServletContext项目启动创建、项目关闭销毁属于全局共享 Bean。二、Spring Bean 完整生命周期Spring Bean 的生命周期是指 Bean 从创建、初始化、投入使用到最终销毁的完整流程核心可概括为五大核心阶段初始化和销毁阶段有固定的方法执行优先级是面试核心考点。1. 实例化Spring 容器扫描到 Bean 定义后通过反射调用 Bean 的构造方法在堆内存中创建空对象此时对象仅完成初始化尚未赋值、无依赖关系。2. 属性注入依赖填充容器自动完成依赖装配通过 Autowired、Value 或配置文件为实例化后的 Bean 填充属性、注入依赖对象建立 Bean 之间的关联关系。3. 初始化固定执行顺序属性赋值完成后执行 Bean 的初始化方法优先级从高到低固定如下PostConstruct 注解方法InitializingBean 接口 afterPropertiesSet() 方法自定义 init-method 初始化方法4. 运行使用阶段初始化完成的 Bean 存入 Spring 容器缓存正式对外提供服务响应业务调用、处理业务逻辑。5. 销毁容器关闭时执行当 Spring 容器关闭、项目停止时执行 Bean 的销毁方法优先级从高到低固定如下PreDestroy 注解方法DisposableBean 接口 destroy() 方法自定义 destroy-method 销毁方法三、面试极简口述总结作用域Spring Bean 默认是 singleton 单例容器全局唯一、统一管理生命周期prototype 每次获取都会新建实例容器不负责销毁request、session、application 仅在 Web 环境生效分别对应单次请求、单个用户会话、全局应用。同时单例 Bean 存在线程安全问题不建议存储可变成员变量。生命周期整体流程为 实例化 → 属性注入 → 初始化 → 运行使用 → 销毁。初始化优先级注解 接口 自定义方法销毁优先级同样遵循注解优先、接口次之、自定义方法最后的规则。四、核心面试易错点Spring 单例是容器级单例并非 JVM 全局单例prototype 原型 Bean 容器不管理销毁需手动释放资源初始化、销毁方法执行顺序固定是面试高频提问点单例 Bean 严禁定义可变成员变量避免并发数据问题。
Spring Bean 作用域与生命周期
发布时间:2026/5/28 1:25:14
一、Spring Bean 作用域Bean 作用域用于控制 Bean 实例的创建规则、数量及存活范围Spring 官方提供 5 种核心作用域默认作用域为singleton单例。1. singleton单例默认整个 Spring IoC 容器中仅会创建一个 Bean 实例全局所有调用、注入场景都会复用该实例Bean 的创建与销毁均由 Spring 容器统一管理。核心注意点单例 Bean非线程安全多线程并发场景下禁止在 Bean 中定义成员变量存储业务数据避免数据错乱问题。适用场景无状态业务 Bean如 Service、Dao、工具类、配置类等。2. prototype原型每次通过容器获取 Bean、依赖注入 Bean 时都会创建一个全新的实例。与单例模式最大的区别是Spring 容器只负责创建原型 Bean不管理其销毁资源释放需要开发者手动处理。适用场景有状态、需要独立实例的业务场景多线程专属 Bean。3. request请求作用域仅适用于 Web 开发环境。每一次 HTTP 请求都会创建一个全新的 Bean请求处理结束后该 Bean 会自动销毁。4. session会话作用域仅适用于 Web 开发环境。对应单个用户的浏览器会话同一个用户的多次请求共享一个 Bean当用户会话超时、主动退出或关闭页面时Bean 随之销毁。适用场景存储用户登录信息、临时购物车数据等用户专属数据。5. application应用作用域仅适用于 Web 开发环境。整个 Web 应用生命周期内只存在一个 Bean作用域范围等同于 ServletContext项目启动创建、项目关闭销毁属于全局共享 Bean。二、Spring Bean 完整生命周期Spring Bean 的生命周期是指 Bean 从创建、初始化、投入使用到最终销毁的完整流程核心可概括为五大核心阶段初始化和销毁阶段有固定的方法执行优先级是面试核心考点。1. 实例化Spring 容器扫描到 Bean 定义后通过反射调用 Bean 的构造方法在堆内存中创建空对象此时对象仅完成初始化尚未赋值、无依赖关系。2. 属性注入依赖填充容器自动完成依赖装配通过 Autowired、Value 或配置文件为实例化后的 Bean 填充属性、注入依赖对象建立 Bean 之间的关联关系。3. 初始化固定执行顺序属性赋值完成后执行 Bean 的初始化方法优先级从高到低固定如下PostConstruct 注解方法InitializingBean 接口 afterPropertiesSet() 方法自定义 init-method 初始化方法4. 运行使用阶段初始化完成的 Bean 存入 Spring 容器缓存正式对外提供服务响应业务调用、处理业务逻辑。5. 销毁容器关闭时执行当 Spring 容器关闭、项目停止时执行 Bean 的销毁方法优先级从高到低固定如下PreDestroy 注解方法DisposableBean 接口 destroy() 方法自定义 destroy-method 销毁方法三、面试极简口述总结作用域Spring Bean 默认是 singleton 单例容器全局唯一、统一管理生命周期prototype 每次获取都会新建实例容器不负责销毁request、session、application 仅在 Web 环境生效分别对应单次请求、单个用户会话、全局应用。同时单例 Bean 存在线程安全问题不建议存储可变成员变量。生命周期整体流程为 实例化 → 属性注入 → 初始化 → 运行使用 → 销毁。初始化优先级注解 接口 自定义方法销毁优先级同样遵循注解优先、接口次之、自定义方法最后的规则。四、核心面试易错点Spring 单例是容器级单例并非 JVM 全局单例prototype 原型 Bean 容器不管理销毁需手动释放资源初始化、销毁方法执行顺序固定是面试高频提问点单例 Bean 严禁定义可变成员变量避免并发数据问题。