Bean的作用域和生命周期(下)

简介: Bean的作用域和生命周期(下)

request — 请求作用域


描述🍭

每次 HTTP 请求都会创建一个新的实例

一次 HTTP 的请求和响应共享同一个 Bean

适用场景🍭

在 SpringMVC 中使用

session — 会话作用域


描述🍭

在一个 HTTP Session 中创建一个新的实例

举个栗子🌰

用户 Jack 登录他的账号, 在 Jack 登陆状态中, Bean 处于共享状态(针对于 Jack 的信息)

另一个用户 Tom 登录他的账号, 在 Tom 登陆状态中, Bean 处于共享状态(针对于 Tom 的信息)

对于 Jack 和 Tom, 他们的 Bean 是隔离而非共享

适用场景🍭

在 SpringMVC 中使用

application — 全局作用域


描述🍭

在一个 HTTP Servlet Context 中创建一个新的实例

适用场景🍭

在 SpringMVC 中使用

websocket — HTTP WebSocket 作用域


描述🍭

在一个 HTTP WebSocket 的生命周期中创建一个新的实例

WebSocket 的每次会话中, 保存了一个 Map 结构的头信息, 用于包裹客户端消息头

第一次初始化后, 直到 WebSocket 结束都是同一个 Bean

适用场景🍭

在 SpringMVC 中使用

对比单例作用域与全局作用域


  1. singleton 是 Spring Core 的作用域
    application 是 Spring Web 的作用域
  2. singleton 作用于 IOC 容器
    application 作用于 Servlet 容器

设置作用域


利用 @Scope() 设置作用域

作用域 设置方式
singleton — 单例作用域 @Scope("singleton") / @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON))
prototype — 原型作用域 @Scope("prototype") / @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
request — 请求作用域 @Scope("request") / @Scope(WebApplicationContext.SCOPE_REQUEST)
session — 会话作用域 @Scope("session") / @Scope(WebApplicationContext.SCOPE_SESSION)
application — 全局作用域 @Scope("application") / @Scope(WebApplicationContext.SCOPE_APPLICATION)

以 prototype — 原型作用域 为例

🔎Spring的执行流程


  1. 启动容器(项目)
  2. 读取xml配置文件, 将 Bean 初始化
  • 直接注册 Bean(<bean id="" class=""></bean>)
  • 配置根扫描路径(<content:component-scan base-package=""></content:component-scan>)
  1. 将 Bean 存储至 Spring
  2. 从 Spring 中读取 Bean

启动容器(项目)

读取xml配置文件, 将 Bean 初始化

将 Bean 存储至 Spring

从 Spring 中读取 Bean

🔎Bean的生命周期


Bean 的生命周期分为 5 个部分

  1. 实例化 Bean(为 Bean 分配内存空间)
    实例化是一个从无到有的过程, 将字节码转换成内存中的对象, 分配了内存空间 → 类似于 JVM 的加载过程
  2. 设置属性(Bean 注入)
  3. 初始化 Bean
  • 实现了各种 Aware 的通知方法, 例如 BeanNameAware, BeanFactoryAware…
  • 执行 BeanPostProcessor 初始化的前置方法
  • 执行 @PostConstruct 初始化方法
  • 执行指定的 init-method 初始化方法(如果有)
  • 执行 BeanPostProcessor 初始化的后置方法
  1. 使用 Bean
  2. 销毁 Bean

对比 @PostConstruct 与 init-method

相同🍭

都是初始化方法

不同🍭

@PostConstruct 使用注解进行初始化

init-method 使用 xml 进行初始化(<bean></bean>)

执行顺序 @PostConstruct > init-method

对Bean的生命周期的解释


实例化🍂

类似于购买了一套毛坯房

设置属性(Bean 注入)🍂

为毛坯房挑选装修风格, 装修材料(引入外部资源)

Bean 初始化🍂

装修毛坯房

  • 实现了各种 Aware 的通知方法🍂
    雇用各种装修工人进行装修(水工, 电工, 瓦工…)
  • 执行 BeanPostProcessor 初始化的前置方法🍂
    装修工人到达施工现场, 制定装修方案
  • 执行初始化方法🍂
    有 2 批装修工人
    一批使用现代化装修工具但经验不足(@PostConstruct)
    另一批使用传统装修工具但经验充足(init-method)
    注解的出现时间对比xml较晚
    优先雇用使用现代化装修工具但经验不足的工人 → 执行顺序 @PostConstruct > init-method
  • 执行 BeanPostProcessor 初始化的后置方法🍂
    完成装修任务的工人做的一些善后工作(清理装修的垃圾…)

使用Bean🍂

购房者搬进装修好的房子

销毁Bean🍂

购房者将房子卖掉

示例


示例代码🍂

package com.demo.component;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
//@Component
public class BeanLifeComponent implements BeanNameAware {
    @Override
    public void setBeanName(String s) {
        System.out.println("执行了通知");
    }
    public void init() {
        System.out.println("执行了 Init-method");
    }
    @PostConstruct
    public void postConstruct() {
        System.out.println("执行了 @PostConstruct");
    }
    @PreDestroy
    public void preDestroy() {
        System.out.println("执行 PreDestroy — 销毁方法");
    }

配置文件🍂

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:content="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    <content:component-scan base-package="com.demo"></content:component-scan>
        <bean id="myComponent" class="com.demo.component.BeanLifeComponent"
              init-method="init"></bean>
</beans>

示例代码🍂

public static void main(String[] args) {
    // ClassPathXmlApplicationContext 包含销毁方法
    // ApplicationContext 不包含销毁方法
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
    BeanLifeComponent lifeComponent = context.getBean("myComponent", BeanLifeComponent.class);
    System.out.println("使用 Bean");
    // 销毁 Bean
    context.destroy();
}

🔎结尾

创作不易,如果对您有帮助,希望您能点个免费的赞👍

大家有什么不太理解的,可以私信或者评论区留言,一起加油

相关文章
|
8小时前
|
人工智能 自然语言处理 文字识别
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考
Qwen3.7-Max是阿里云百炼面向智能体时代推出的新一代旗舰模型,对标GPT-5.5、Claude Opus 4.7等闭源旗舰。该模型支持百万级token上下文窗口,具备顶级推理能力、多模态搜索与视觉理解增强、流式输出低延迟响应等核心优势,覆盖编程、办公、长周期自主执行等复杂场景。同时支持OpenAI接口兼容,便于系统快速迁移。用户可通过Token Plan团队或节省计划等订阅方式灵活调用,适合企业级高要求场景使用。
7209 31
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考
|
8小时前
|
数据采集 人工智能 前端开发
让 Coding Agent 从黑盒到透明:阿里云 Agent 观测审计数据采集实践
AI Agent 规模化落地带来执行黑盒、行为难追溯、成本难度量三大难题。阿里云基于 OTel 标准,面向 Coding Agent、个人通用助理和框架型 Agent,推出 LoongSuite Pilot、插件及探针等无侵入采集方案,让 Agent 实现可看见、可分析、可审计、可治理。
629 140
|
8小时前
|
人工智能 缓存 自然语言处理
阿里Qwen3.7-Max评测:Agent能力显著提升,耗时与调用成本大幅下降
阿里云百炼推出面向智能体的旗舰大模型Qwen3.7-Max,具备长周期自主执行能力,显著提升编程、办公自动化等复杂任务处理水平;支持MCP集成与多框架兼容,并以限时5折+100万Tokens免费试用大幅降低使用门槛,助力企业高效落地AI应用。在阿里云百炼平台快速体验:https://t.aliyun.com/U/fPVHqY
|
8小时前
|
人工智能 弹性计算 运维
阿里云发布堡垒机智能运维Agent,运维交互进入自然语言新时代
支持自然语言运维,提升效率与安全双保障。
1159 1
|
8小时前
|
人工智能 安全 定位技术
CodeGraph深度解析 让Claude Code工具调用直降七成的核心原理与实操教程
如今以Claude Code为代表的AI编程智能体已经成为开发者日常编码、项目重构、漏洞修复的必备工具。但在长期使用过程中,几乎所有开发者都会遇到同一个明显痛点:AI虽然具备强大的代码生成与分析能力,却常常陷入盲目探索的循环中。
1224 2
|
8小时前
|
存储 定位技术 数据库
CodeGraph 如何让 Claude Code减少 7 成工具调用?
CodeGraph 为 Coding Agent 提供本地代码知识图谱,把函数、类、调用链和框架路由提前整理成“项目地图”,减少盲目搜索和文件读取。它不是新 Agent,而是上下文基础设施,让 Agent 更快找到正确代码路径,平均减少 7 成工具调用。
1297 3
|
8小时前
|
人工智能 弹性计算 安全
阿里云618活动时间、活动入口、优惠活动详细解读
2026年阿里云618创新加速季已全面开启,作为年度力度最大的云产品促销活动,本次大促覆盖轻量应用服务器、ECS云服务器、GPU云服务器、数据库、AI算力、安全服务、CDN等全品类产品,推出5亿元算力补贴、新用户限时秒杀、普惠满减、企业专享、免费试用、云大使返佣等多重福利,个人开发者、中小企业、AI团队均可享受专属低价。本文将系统梳理2026年阿里云618活动的完整时间节点、官方参与入口、各类优惠细则、使用规则、热门产品推荐及实操代码,帮助用户精准参与、高效省钱,以最低成本完成上云部署。
1045 5
|
8小时前
|
人工智能 自然语言处理 算法
|
8小时前
|
人工智能 自然语言处理 安全
Vibe Coding 实战:别盲目跟风,先分清 vibe coding 适合什么场景
本文系统总结vibe coding实战经验:明确其适用场景(原型、小工具、标准化模块),剖析5步落地流程(场景判定→结构化提示词→目录初始化→分模块生成→自动化校验),指出四大常见误区,并推荐适配工具Trae。强调“场景匹配+规则前置”是提效关键,避免盲目套用。
861 1
|
8小时前
|
人工智能 运维 API
2026年阿里云百炼通义千问Qwen3.7-plus深度介绍 功能特性、使用优势及618大促订阅方案指南
大模型技术的普及,让AI能力逐步融入个人办公、内容创作、代码编写、企业运营、教育培训等各类场景。不同定位的模型对应不同使用需求,旗舰级模型性能强劲但使用成本偏高,轻量化模型价格低廉却难以胜任复杂任务,而介于两者之间的中端主力模型,凭借均衡的能力、亲民的定价、广泛的场景适配性,成为绝大多数个人用户、小型团队、中小企业的首选。
410 1