前言在之前已经有几篇文章来讲解过Bean的创建和依赖注入等相关内容这篇文章补充一下关于Bean的一些重要内容Bean作用域和生命周期一、Bean作用域1.定义作用域 Spring 容器创建 Bean 的「实例数量」和「存活范围」它决定了整个项目有几个这个 Bean 对象什么时候创建什么时候销毁是否线程共享2.分类Spring 6主流提供六种内置作用域日常开发常用前四种singleton单例默认prototype多例request请求域session会话域application应用域websocket长连接域二、六大作用域详解配置指定作用域使用注解Scope1.singleton 单例默认作用域规则整个 Spring IoC 容器中仅存在一个 Bean 实例全局共享。创建时机默认容器启动时立即初始化饿汉式配合lazy-inittrue第一次获取 Bean 时才创建懒加载销毁时机IoC 容器关闭时销毁。使用场景无状态 BeanService、Mapper、Controller、工具类绝大多数业务组件。注意单例 Bean 非线程安全。如果 Bean 中有成员变量多线程并发修改会出现数据错乱。配置注解Component // 可省略默认就是 singleton Scope(singleton) public class UserService { }2.prototype 多例规则每次从容器获取 Bean都会创建全新实例容器只负责创建不管理生命周期。创建时机每次getBean()/ 依赖注入时创建。销毁时机Spring 容器不负责销毁由 JVM GC 回收。使用场景有状态 Bean、实体对象、请求级临时对象、非共享实例。易错点单例 BeanService/Controller中注入多例 Bean多例会失效。因为单例仅启动时注入一次依赖后续不会刷新。解决方案通过ApplicationContext手动获取、使用ObjectProvider。配置注解Component Scope(prototype) public class Order { }3.request 请求域Web 环境专属核心规则每一次 HTTP 请求都会创建一个全新的 Bean 实例请求处理完毕Bean 立即销毁。生命周期跟随 HTTP 请求最短、最临时的 Web 作用域。使用场景存储单次请求专属临时数据、请求上下文、请求参数封装、单次请求日志追踪信息。注解配置Component Scope(request) public class RequestContext { // 存储本次请求的请求ID、客户端IP、请求时间等临时数据 private String requestId; private String clientIp; }4.session 会话域Web 环境专属核心规则同一个用户浏览器 Session 会话对应唯一一个 Bean 实例会话过期、浏览器关闭、Session 失效Bean 自动销毁。生命周期跟随用户会话贯穿用户多次接口请求。使用场景存储用户会话级数据如登录用户信息、临时会话缓存、权限临时标识、用户行为记录。底层特点Bean 绑定HttpSession不同用户会话数据完全隔离。注解配置Component Scope(session) public class UserSessionInfo { // 存储当前登录用户信息单用户会话共享 private Long userId; private String username; private String token; }5.application 应用域Web 环境专属核心规则整个 Web 应用全局仅存在一个 Bean 实例生命周期与ServletContext完全一致。关键区别高频面试singleton仅单个 Spring IoC 容器内单例application整个 Web 应用、跨 Spring 容器全局单例作用域范围更大使用场景存储项目全局公共数据、系统配置、全局统计数据、公共常量缓存。销毁时机项目停止、Web容器销毁时统一释放注解配置Component Scope(application) public class SystemGlobalConfig { // 项目全局配置全应用共享 private String projectName; private Integer maxUploadSize; }6.websocket 长连接域Web 环境专属核心规则每一条 WebSocket 长连接对应一个独立 Bean 实例连接断开、客户端下线Bean 立即销毁。使用场景即时通讯、消息推送、在线聊天室、实时数据监控、长连接状态存储。注解配置代码Component Scope(websocket) public class WebSocketSessionBean { // 存储单条长连接专属信息 private String sessionId; private Long connectUserId; private LocalDateTime connectTime; }三、Spring Bean生命周期Spring Bean生命周期是Spring IoC容器对Bean从创建、初始化、对外服务到最终销毁的全流程管控。整个过程核心分为实例化、属性赋值、初始化、销毁四大阶段涵盖反射创建对象、DI依赖注入、Aware接口回调、初始化方法执行、AOP动态代理、容器销毁回收等核心底层逻辑。1.阶段一Bean实例化造对象实例化是Bean生命周期的第一步核心目的通过底层机制创建Bean的原始空对象此时对象仅被分配内存尚未赋值、未完成初始化。Spring 提供三种实例化方式优先级与场景各有不同1反射构造函数实例化最常用Spring 自动推断Bean的可用构造方法通过JDK反射机制创建对象。如果Bean存在无参构造默认优先使用无参构造实例化如果仅有有参构造Spring会自动触发构造器注入完成实例化这是日常开发中Component、Service等注解Bean的默认实例化方式。2静态工厂实例化通过工厂类的静态方法创建Bean对象无需创建工厂实例直接调用静态方法生成目标Bean多用于框架内置工具类、静态资源Bean的创建。3实例工厂实例化需要先创建工厂Bean实例再通过工厂实例的普通方法创建目标Bean灵活性更高可根据工厂实例的状态动态生成不同Bean对象。2.阶段二属性赋值DI依赖注入实例化完成后Spring进入依赖注入阶段也是IoC容器的核心价值体现。此阶段核心目的解析Bean的依赖关系自动完成属性赋值让Bean具备完整的依赖资源。1四大自动装配规则Spring默认提供四种装配模式日常开发核心使用byType配合Autowired注解实现自动装配byType按类型装配默认主流模式根据属性类型匹配容器中的BeanAutowired默认基于此实现byName按名称装配根据属性名与Bean的id/name匹配赋值constructor构造器装配通过有参构造完成依赖注入Spring4.3后优先推荐none不自动装配关闭自动装配需手动配置依赖。2 核心难点循环依赖问题循环依赖只发生在属性赋值阶段是此阶段最核心的底层考点。场景A依赖B、B依赖ASpring在递归赋值时会产生循环引用。Spring通过三级缓存机制完美解决单例Bean、setter/字段注入的循环依赖问题但无法解决多例Bean、构造器注入的循环依赖。3.阶段三初始化增强与加工对象属性赋值完成后Bean的依赖已经就绪Spring开始对Bean进行自定义加工、生命周期回调、动态代理增强是Bean从“可用对象”变成“完整业务对象”的关键阶段。整个初始化分为三步执行顺序固定。1 第一步XXXAware接口回调容器感知如果Bean实现了Spring内置的Aware感知接口Spring会自动执行对应回调方法让普通Bean拥有感知容器资源的能力。常用核心Aware接口BeanNameAware感知自身Bean名称BeanFactoryAware感知所属Bean工厂ApplicationContextAware感知Spring应用上下文。未实现Aware接口的Bean直接跳过此步骤。2第二步自定义初始化生命周期回调Spring提供三种初始化方式执行顺序固定、优先级不可逆用于开发者自定义Bean初始化业务逻辑如参数校验、资源初始化、缓存预热等PostConstruct注解JSR标准优先级最高InitializingBean#afterPropertiesSet接口方法Spring内置Bean(initMethod xxx)自定义初始化方法优先级最低3第三步AOP动态代理创建核心增强初始化收尾阶段Spring会判断当前Bean是否需要AOP切面增强如果Bean存在匹配的切面规则Spring在此阶段生成动态代理对象JDK动态代理/CGLIB代理最终放入容器的是代理Bean如果无需AOP增强直接使用原始Bean对象。4.阶段四销毁容器关闭回收资源Bean销毁是生命周期的最后一步仅针对单例Beansingleton生效多例Beanprototype由JVM GC回收Spring容器不负责管理销毁。1触发时机仅在Spring IoC容器关闭时触发项目停机、上下文close、应用销毁。2销毁生命周期回调执行顺序固定与初始化逻辑对应三种销毁方式优先级固定用于释放资源关闭连接、清空缓存、停止线程等PreDestroy注解优先级最高DisposableBean#destroy接口方法Spring内置Bean(destroyMethod xxx)自定义销毁方法优先级最低5.整个过程总结实例化反射/工厂创建原始空对象只分配内存无赋值无逻辑属性赋值完成DI自动装配解决依赖关系触发循环依赖处理初始化Aware容器感知 → 自定义初始化逻辑 → AOP动态代理增强生成成品Bean销毁容器关闭时执行销毁回调优雅释放资源仅单例Bean生效。
Spring Bean作用域以及生命周期
发布时间:2026/5/28 23:10:19
前言在之前已经有几篇文章来讲解过Bean的创建和依赖注入等相关内容这篇文章补充一下关于Bean的一些重要内容Bean作用域和生命周期一、Bean作用域1.定义作用域 Spring 容器创建 Bean 的「实例数量」和「存活范围」它决定了整个项目有几个这个 Bean 对象什么时候创建什么时候销毁是否线程共享2.分类Spring 6主流提供六种内置作用域日常开发常用前四种singleton单例默认prototype多例request请求域session会话域application应用域websocket长连接域二、六大作用域详解配置指定作用域使用注解Scope1.singleton 单例默认作用域规则整个 Spring IoC 容器中仅存在一个 Bean 实例全局共享。创建时机默认容器启动时立即初始化饿汉式配合lazy-inittrue第一次获取 Bean 时才创建懒加载销毁时机IoC 容器关闭时销毁。使用场景无状态 BeanService、Mapper、Controller、工具类绝大多数业务组件。注意单例 Bean 非线程安全。如果 Bean 中有成员变量多线程并发修改会出现数据错乱。配置注解Component // 可省略默认就是 singleton Scope(singleton) public class UserService { }2.prototype 多例规则每次从容器获取 Bean都会创建全新实例容器只负责创建不管理生命周期。创建时机每次getBean()/ 依赖注入时创建。销毁时机Spring 容器不负责销毁由 JVM GC 回收。使用场景有状态 Bean、实体对象、请求级临时对象、非共享实例。易错点单例 BeanService/Controller中注入多例 Bean多例会失效。因为单例仅启动时注入一次依赖后续不会刷新。解决方案通过ApplicationContext手动获取、使用ObjectProvider。配置注解Component Scope(prototype) public class Order { }3.request 请求域Web 环境专属核心规则每一次 HTTP 请求都会创建一个全新的 Bean 实例请求处理完毕Bean 立即销毁。生命周期跟随 HTTP 请求最短、最临时的 Web 作用域。使用场景存储单次请求专属临时数据、请求上下文、请求参数封装、单次请求日志追踪信息。注解配置Component Scope(request) public class RequestContext { // 存储本次请求的请求ID、客户端IP、请求时间等临时数据 private String requestId; private String clientIp; }4.session 会话域Web 环境专属核心规则同一个用户浏览器 Session 会话对应唯一一个 Bean 实例会话过期、浏览器关闭、Session 失效Bean 自动销毁。生命周期跟随用户会话贯穿用户多次接口请求。使用场景存储用户会话级数据如登录用户信息、临时会话缓存、权限临时标识、用户行为记录。底层特点Bean 绑定HttpSession不同用户会话数据完全隔离。注解配置Component Scope(session) public class UserSessionInfo { // 存储当前登录用户信息单用户会话共享 private Long userId; private String username; private String token; }5.application 应用域Web 环境专属核心规则整个 Web 应用全局仅存在一个 Bean 实例生命周期与ServletContext完全一致。关键区别高频面试singleton仅单个 Spring IoC 容器内单例application整个 Web 应用、跨 Spring 容器全局单例作用域范围更大使用场景存储项目全局公共数据、系统配置、全局统计数据、公共常量缓存。销毁时机项目停止、Web容器销毁时统一释放注解配置Component Scope(application) public class SystemGlobalConfig { // 项目全局配置全应用共享 private String projectName; private Integer maxUploadSize; }6.websocket 长连接域Web 环境专属核心规则每一条 WebSocket 长连接对应一个独立 Bean 实例连接断开、客户端下线Bean 立即销毁。使用场景即时通讯、消息推送、在线聊天室、实时数据监控、长连接状态存储。注解配置代码Component Scope(websocket) public class WebSocketSessionBean { // 存储单条长连接专属信息 private String sessionId; private Long connectUserId; private LocalDateTime connectTime; }三、Spring Bean生命周期Spring Bean生命周期是Spring IoC容器对Bean从创建、初始化、对外服务到最终销毁的全流程管控。整个过程核心分为实例化、属性赋值、初始化、销毁四大阶段涵盖反射创建对象、DI依赖注入、Aware接口回调、初始化方法执行、AOP动态代理、容器销毁回收等核心底层逻辑。1.阶段一Bean实例化造对象实例化是Bean生命周期的第一步核心目的通过底层机制创建Bean的原始空对象此时对象仅被分配内存尚未赋值、未完成初始化。Spring 提供三种实例化方式优先级与场景各有不同1反射构造函数实例化最常用Spring 自动推断Bean的可用构造方法通过JDK反射机制创建对象。如果Bean存在无参构造默认优先使用无参构造实例化如果仅有有参构造Spring会自动触发构造器注入完成实例化这是日常开发中Component、Service等注解Bean的默认实例化方式。2静态工厂实例化通过工厂类的静态方法创建Bean对象无需创建工厂实例直接调用静态方法生成目标Bean多用于框架内置工具类、静态资源Bean的创建。3实例工厂实例化需要先创建工厂Bean实例再通过工厂实例的普通方法创建目标Bean灵活性更高可根据工厂实例的状态动态生成不同Bean对象。2.阶段二属性赋值DI依赖注入实例化完成后Spring进入依赖注入阶段也是IoC容器的核心价值体现。此阶段核心目的解析Bean的依赖关系自动完成属性赋值让Bean具备完整的依赖资源。1四大自动装配规则Spring默认提供四种装配模式日常开发核心使用byType配合Autowired注解实现自动装配byType按类型装配默认主流模式根据属性类型匹配容器中的BeanAutowired默认基于此实现byName按名称装配根据属性名与Bean的id/name匹配赋值constructor构造器装配通过有参构造完成依赖注入Spring4.3后优先推荐none不自动装配关闭自动装配需手动配置依赖。2 核心难点循环依赖问题循环依赖只发生在属性赋值阶段是此阶段最核心的底层考点。场景A依赖B、B依赖ASpring在递归赋值时会产生循环引用。Spring通过三级缓存机制完美解决单例Bean、setter/字段注入的循环依赖问题但无法解决多例Bean、构造器注入的循环依赖。3.阶段三初始化增强与加工对象属性赋值完成后Bean的依赖已经就绪Spring开始对Bean进行自定义加工、生命周期回调、动态代理增强是Bean从“可用对象”变成“完整业务对象”的关键阶段。整个初始化分为三步执行顺序固定。1 第一步XXXAware接口回调容器感知如果Bean实现了Spring内置的Aware感知接口Spring会自动执行对应回调方法让普通Bean拥有感知容器资源的能力。常用核心Aware接口BeanNameAware感知自身Bean名称BeanFactoryAware感知所属Bean工厂ApplicationContextAware感知Spring应用上下文。未实现Aware接口的Bean直接跳过此步骤。2第二步自定义初始化生命周期回调Spring提供三种初始化方式执行顺序固定、优先级不可逆用于开发者自定义Bean初始化业务逻辑如参数校验、资源初始化、缓存预热等PostConstruct注解JSR标准优先级最高InitializingBean#afterPropertiesSet接口方法Spring内置Bean(initMethod xxx)自定义初始化方法优先级最低3第三步AOP动态代理创建核心增强初始化收尾阶段Spring会判断当前Bean是否需要AOP切面增强如果Bean存在匹配的切面规则Spring在此阶段生成动态代理对象JDK动态代理/CGLIB代理最终放入容器的是代理Bean如果无需AOP增强直接使用原始Bean对象。4.阶段四销毁容器关闭回收资源Bean销毁是生命周期的最后一步仅针对单例Beansingleton生效多例Beanprototype由JVM GC回收Spring容器不负责管理销毁。1触发时机仅在Spring IoC容器关闭时触发项目停机、上下文close、应用销毁。2销毁生命周期回调执行顺序固定与初始化逻辑对应三种销毁方式优先级固定用于释放资源关闭连接、清空缓存、停止线程等PreDestroy注解优先级最高DisposableBean#destroy接口方法Spring内置Bean(destroyMethod xxx)自定义销毁方法优先级最低5.整个过程总结实例化反射/工厂创建原始空对象只分配内存无赋值无逻辑属性赋值完成DI自动装配解决依赖关系触发循环依赖处理初始化Aware容器感知 → 自定义初始化逻辑 → AOP动态代理增强生成成品Bean销毁容器关闭时执行销毁回调优雅释放资源仅单例Bean生效。