一、Bean的作用域1.1 什么是Bean作用域简单来说Bean作用域是Spring用来控制Bean实例创建数量、对象存活范围的核心机制。一句话区分从Spring容器中取Bean是一直用同一个对象还是每次都新建对象全部由作用域决定。Spring内置一共6种作用域分为4种通用作用域 2种Web专属作用域。通用作用域可用于所有Spring项目Web专属作用域仅适用于Web工程。1.2 六大作用域详细汇总作用域类型核心含义实例数量适用场景singleton默认单例作用域整个Spring容器全局仅存在一个Bean实例全局1个无状态Bean日常开发绝大多数场景Service、Controller、Dao、工具类prototype原型多例作用域每次获取、注入Bean都会新建对象多个有状态Bean、需要独立对象、避免数据共享冲突的场景request一次HTTP请求对应一个独立Bean实例请求级Web项目存储单次请求的临时数据session一个用户会话对应一个Bean实例会话级存储用户登录状态、会话缓存数据application整个Web应用全局唯一和项目容器同生命周期全局1个项目全局配置、公共常量、全局参数websocket一个WebSocket长连接对应一个Bean实例连接级即时通讯、消息推送、WebSocket长连接业务1.3 核心作用域代码实战开发常用实际开发中我们使用最多的只有singleton单例和prototype多例其余Web专属作用域仅在特殊业务场景中使用。1、singleton 单例默认作用域Spring容器启动初始化阶段就会创建单例Bean全局共享同一个对象程序中所有注入、获取Bean的操作拿到的都是同一个实例。核心特点容器启动初始化、全局唯一、性能高、非线程安全2、prototype 多例原型作用域多例Bean不会在容器启动时初始化每次注入、调用getBean()获取Bean时都会全新创建一个对象。核心特点多实例、线程安全、Spring不管理多例Bean的初始化和销毁生命周期二、Bean完整生命周期Bean生命周期就是Bean在Spring IoC容器中从创建、赋值、初始化、使用到最终销毁的完整全过程。这是Java后端面试高频必考知识点同时也是解决Spring Bean注入报错、初始化异常、对象失效等问题的核心底层依据2.1 整体执行流程容器启动 → 实例化 → 属性赋值 → Aware回调 → 前置处理器 → 初始化 → 后置处理器 → 就绪使用 → 容器关闭销毁2.2 七步流程详细拆解第一步实例化new空对象Spring IoC容器启动后通过反射机制调用类的无参构造方法为Bean创建一个空对象完成实例化操作。 重点自定义Bean类如果没有无参构造方法会直接抛出异常导致Bean创建失败第二步属性赋值依赖注入容器通过setter方法、构造器注入、Autowired注解等多种方式为实例化后的空对象完成成员变量赋值实现依赖注入。 日常开发中常见的“找不到setter方法”“依赖注入失败”报错基本都出在这一步。第三步Aware接口容器回调Spring提供内置扩展接口让Bean具备感知Spring容器资源的能力完成容器资源的绑定BeanNameAware获取当前Bean的名称/idBeanFactoryAware获取当前Bean工厂对象ApplicationContextAware获取Spring全局上下文对象第四步Bean前后置处理器增强BeanPostProcessorBean后置处理器是Spring的全局核心增强机制也是Spring AOP、注解功能增强的底层原理。会在Bean初始化前后执行自定义的前置、后置处理逻辑。第五步自定义初始化逻辑Spring提供三种自定义Bean初始化逻辑的方式执行优先级从高到低PostConstruct 注解开发推荐简洁高效实现InitializingBean接口XML配置 init-method 属性第六步Bean就绪使用所有初始化流程执行完毕后完整的Bean对象会被存入Spring单例池正式就绪对外提供业务调用服务。第七步容器关闭销毁仅单例Bean会被Spring容器管理销毁多例Bean由JVM垃圾回收管理。Spring提供两种销毁逻辑实现方式PreDestroy 注解实现DisposableBean接口2.3 完整生命周期代码演示以下代码可直接复制运行控制台会精准打印每一步的执行顺序直观看懂Bean完整生命周期import org.springframework.beans.factory.BeanNameAware; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.DisposableBean; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; /** * Spring Bean 完整生命周期测试 * author 个人博客 */ public class LifeCycleBean implements BeanNameAware, InitializingBean, DisposableBean { // 1. 实例化执行无参构造创建空对象 public LifeCycleBean() { System.out.println(1、Bean实例化执行无参构造); } // 3. Aware接口回调获取Bean名称 Override public void setBeanName(String name) { System.out.println(3、Aware接口回调Bean名称 name); } // 4. 注解初始化优先级最高 PostConstruct public void postConstruct() { System.out.println(5、初始化PostConstruct 执行); } // 5. 接口初始化 Override public void afterPropertiesSet() throws Exception { System.out.println(5、初始化InitializingBean 执行); } // 销毁方法1注解销毁 PreDestroy public void preDestroy() { System.out.println(7、销毁PreDestroy 执行); } // 销毁方法2接口销毁 Override public void destroy() throws Exception { System.out.println(7、销毁DisposableBean 执行); } }2.4 生命周期最终执行顺序无参构造实例化 → 属性赋值 → Aware接口回调 → Bean前置处理器 → PostConstruct → InitializingBean → init-method → Bean后置处理器 → Bean使用阶段 → 容器关闭销毁三、作用域与生命周期关联关系很多同学会混淆两者的关联这里做精准总结区分不同作用域Bean的生命周期差异singleton单例Bean容器启动时完成实例化、赋值、全部初始化流程容器关闭时触发销毁完整生命周期全程由Spring IoC容器管理prototype多例Bean仅在调用获取时创建对象Spring只负责实例化和属性赋值不管理初始化、销毁流程对象生命周期由JVM全权管理Web专属作用域Beanrequest/session/application/websocket生命周期跟随HTTP请求、用户会话、WebSocket长连接一旦请求结束、会话过期、连接断开Bean自动销毁四、全文总结1、Bean作用域的核心作用是控制Bean的实例数量和存活范围日常开发99%场景仅使用单例、多例两种作用域2、单例Bean性能优异但非线程安全适合无状态业务多例Bean线程安全但创建开销更大适合有状态业务3、Bean完整生命周期是Spring IoC的核心底层逻辑熟记七步执行流程可解决绝大多数Bean注入、初始化、报错问题4、Spring容器只全权管理单例Bean的完整生命周期多例Bean仅负责创建赋值不负责后续生命周期管理。