@Scope(value = WebApplicationContext.SCOPE_REQUEST)和@Scope(“prototype“)区别

文章目录

    • 主要区别
      • [1. **作用域生命周期**](#1. 作用域生命周期)
      • [2. **创建时机和频率**](#2. 创建时机和频率)
      • [3. **使用环境限制**](#3. 使用环境限制)
      • [4. **代理模式 (proxyMode)**](#4. 代理模式 (proxyMode))
      • [5. **内存管理**](#5. 内存管理)
    • 实际测试对比
    • 总结对比表
    • 使用场景

项目代码
https://gitee.com/he-weigang/spring-bean-field.git

我来详细解释这两个Spring Bean作用域注解的区别,并查看项目中的相关代码示例。

Read file: src/main/java/org/example/beans/RequestScopeBean.java

Read file: src/main/java/org/example/beans/PrototypeBean.java

Read file: src/main/java/org/example/service/ScopeTestService.java

根据你项目中的代码,我来详细解释这两种Spring Bean作用域注解的区别:

主要区别

1. 作用域生命周期

@Scope("prototype") (原型作用域):

java 复制代码
@Component
@Scope("prototype")
public class PrototypeBean {
    // 每次从容器获取时都创建新实例
}

@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS) (请求作用域):

java 复制代码
@Component
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class RequestScopeBean {
    // 每个HTTP请求创建一个实例,请求结束时销毁
}

2. 创建时机和频率

  • Prototype作用域 :每次调用 applicationContext.getBean() 或注入时都创建新实例
  • Request作用域:每个HTTP请求只创建一次,在整个请求处理过程中复用同一个实例

3. 使用环境限制

  • Prototype作用域:任何Spring环境都可以使用(包括独立应用程序)
  • Request作用域:只能在Web环境中使用,需要HTTP请求上下文

4. 代理模式 (proxyMode)

Request作用域必须使用代理模式

java 复制代码
proxyMode = ScopedProxyMode.TARGET_CLASS

这是因为:

  • Request作用域Bean的生命周期比注入它的Singleton Bean短
  • Spring创建一个代理对象,在运行时动态获取当前请求对应的Bean实例
  • Prototype作用域不需要代理,因为每次获取都是新实例

5. 内存管理

  • Prototype:Spring容器不负责销毁,需要手动管理
  • Request:请求结束时自动销毁,Spring容器负责生命周期管理

实际测试对比

让我创建一个对比测试来演示区别:

Ran tool

总结对比表

特性 @Scope("prototype") @Scope(value = SCOPE_REQUEST, proxyMode = TARGET_CLASS)
创建频率 每次获取Bean时创建新实例 每个HTTP请求创建一个实例
使用环境 任何Spring环境 仅Web环境(需要HTTP请求上下文)
代理模式 不需要代理 必须使用代理模式
生命周期管理 Spring不管理销毁 请求结束时自动销毁
性能 每次创建有开销 请求期间复用,性能更好
线程安全 每个实例独立,天然线程安全 请求级别隔离,线程安全

使用场景

Prototype适用于

  • 需要每次都是全新状态的对象
  • 有状态的Bean,需要避免共享
  • 独立应用程序(非Web环境)

Request适用于

  • Web应用中需要在整个请求过程中保持状态
  • 请求级别的缓存或临时数据
  • 用户认证信息、请求参数等

项目中已经很好地演示了这两种作用域的使用方式,PrototypeBean用于演示每次获取都是新实例,而RequestScopeBean用于Web环境中的请求级别Bean管理。

相关推荐
sunny.day4 天前
js原型与原型链
开发语言·javascript·原型模式·js原型链
UXbot4 天前
AI网页开发工具能替代工具吗?5大平台对比
前端·人工智能·低代码·ui·原型模式·web app
weixin_307779135 天前
从“大海捞针”到“主动推理”:AI如何重塑云原生故障诊断的根因链
开发语言·人工智能·算法·自动化·原型模式
swordbob5 天前
prototype 注入到 singleton 里,prototype是否还是线程安全的
安全·spring·单例模式·原型模式
isNotNullX6 天前
企业数据中台建设,ETL工具选错了会踩哪些坑?
数据仓库·etl·原型模式
半个烧饼不加肉6 天前
JS 底层探究-- 普通函数和构造函数
开发语言·javascript·原型模式
折哥的程序人生 · 物流技术专研7 天前
Java 23 种设计模式:从踩坑到精通 | 原型模式 —— 克隆对象,深拷贝与浅拷贝的坑你踩过吗?
java·设计模式·架构·原型模式·单一职责原则
ourenjiang9 天前
【学习设计模式】原型模式
学习·设计模式·原型模式
迷藏49410 天前
Python+DuckDB:轻量级BI流水线实战
java·开发语言·python·原型模式
J2虾虾15 天前
Spring AI Alibaba - 检索增强生成(RAG)
人工智能·spring·原型模式