【spring】@Scope注解学习

news2024/11/23 21:59:58

@Scope介绍

@Scope注解是Spring框架中用于指定bean作用域的注解。在Spring中,一个bean的作用域定义了该bean的生命周期和创建bean实例的上下文。Spring提供了几种预定义的作用域,同时也支持自定义作用域。通过使用@Scope注解,开发者可以更精确地控制Spring容器如何创建和维护bean实例。

@Scope源码

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Scope {

	
	@AliasFor("scopeName")
	String value() default "";


	@AliasFor("value")
	String scopeName() default "";


	ScopedProxyMode proxyMode() default ScopedProxyMode.DEFAULT;

}
源代码截图

@Scope属性介绍

  • value:表示作用域,可以取如下值。
    • singleton:这是默认的作用域。在singleton作用域下,无论多少次请求,Spring容器都会为每个bean定义创建一个实例。这个实例在容器的生命周期内是唯一的,所有请求都会共享这个实例。

    • prototype:在prototype作用域下,每次请求或者注入bean时,Spring容器都会创建一个新的bean实例。这意味着每个bean的实例都是独立的,它们之间没有共享状态。

    • request:这个作用域与HTTP请求相关联。在request作用域下,每个HTTP请求都会创建一个新的bean实例。这个bean实例仅在当前请求内有效,请求结束后,该实例就会被销毁。

    • session:与HTTP会话相关。在session作用域下,bean的实例将与用户的HTTP会话绑定。不同的用户会话将会创建不同的bean实例。

    • application:这个作用域与整个web应用的生命周期相关。在application作用域下,bean的实例在所有用户和请求之间共享,并且只在应用的生命周期内有效。

    • websocket:与WebSocket会话相关。在websocket作用域下,每个WebSocket会话都会创建一个新的bean实例。

  • scopeName:Spring4.2版本开始新增的属性,作用与value属性相同。
  • proxyMode:指定Bean对象使用的代理方式,可以取如下值。
    • DEFAULT:默认值,作用与NO相同。
    • NO:不使用代理。
    • INTERFACES:使用JDK基于接口的代理。
    • TARGET_CLASS:使用CGLIB基于目标类的子类创建代理对象。

@Scope注解使用场景

@Scope注解在Spring框架中用于指定Bean实例的生命周期和作用域。以下是一些常见的使用场景:

  1. 单例模式(Singleton):这是默认的作用域。在整个应用中,只会创建一个Bean实例,所有的依赖注入都将使用这个实例。适用于无状态的Bean,例如Service层的Bean。

    @Service
    public class SingletonService {
        // ...
    }
  2. 原型模式(Prototype):每次请求(例如通过Controller的getBean()方法)都会创建一个新的Bean实例。适用于有状态的Bean,例如DAO层的Bean,因为每次请求都需要一个新的实例来处理请求。

    @Repository
    @Scope("prototype")
    public class PrototypeDao {
        // ...
    }
     
  3. 请求作用域(Request):在Web应用中,为每个HTTP请求创建一个新的Bean实例。适用于需要在请求之间保持状态的Bean,例如在处理用户会话数据时。

    @Component
    @Scope("request")
    public class RequestScopedComponent {
        // ...
    }
  4. 会话作用域(Session):在Web应用中,为每个HTTP Session创建一个新的Bean实例。适用于需要跨多个请求保持状态的Bean,例如购物车数据。

    @Component
    @Scope("session")
    public class SessionScopedComponent {
        // ...
    }
     
  5. 应用作用域(Application):在Web应用中,为每个Web应用程序创建一个Bean实例。适用于需要在整个应用程序中共享的数据,例如应用程序配置。

    @Component
    @Scope("application")
    public class ApplicationScopedComponent {
        // ...
    }
     
  6. WebSocket作用域(WebSocket):在Web应用中,为每个WebSocket会话创建一个Bean实例。适用于需要在WebSocket会话中保持状态的Bean,例如聊天应用中的用户状态。

    @Component
    @Scope("websocket")
    public class WebSocketScopedComponent {
        // ...
    }
     

@Scope测试示例代码

示例代码 一
ScopePrototypeDemo类
package com.yang.SpringTest.annotation.scopeLearn;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;

/**
 * <p>ScopePrototypeDemo类</p>
 *
 * @author By: chengxuyuanshitang
 * Package com.yang.SpringTest.annotation.scopeLearn
 * Ceate Time 2024-04-09 17:04
 */
@Data
@Slf4j
public class ScopePrototypeDemo {
    public ScopePrototypeDemo () {
        log.info ("------ ScopePrototypeDemo init -----");
    }
}

ScopeSingletonDemo类
package com.yang.SpringTest.annotation.scopeLearn;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;

/**
 * <p>ScopeSingletonDemo类</p>
 *
 * @author By: chengxuyuanshitang
 * Package com.yang.SpringTest.annotation.scopeLearn
 * Ceate Time 2024-04-09 17:04
 */
@Data
@Slf4j
public class ScopeSingletonDemo {
    public ScopeSingletonDemo () {
        log.info ("------ ScopeSingletonDemo init -----");
    }
}

ScopeDemoConfig配置类

package com.yang.SpringTest.annotation.scopeLearn;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

/**
 * <p>ScopeDemoConfig配置类</p>
 *
 * @author By: chengxuyuanshitang
 * Package com.yang.SpringTest.annotation.scopeLearn
 * Ceate Time 2024-04-09 17:08
 */
@Configuration
@ComponentScan(value = {"com.yang.SpringTest.annotation.scopeLearn"})
public class ScopeDemoConfig {
    @Bean
    @Scope(value = "singleton")
    public ScopePrototypeDemo scopePrototypeDemo () {
        return new ScopePrototypeDemo ();
    }

    @Bean
    @Scope(value = "prototype")
    public ScopeSingletonDemo scopeSingletonDemo () {
        return new ScopeSingletonDemo ();
    }
}

ScopeDemoTest 测试类
package com.yang.SpringTest.annotation.scopeLearn;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * <p>ScopeDemoTest 测试类</p>
 *
 * @author By: chengxuyuanshitang
 * Package com.yang.SpringTest.annotation.scopeLearn
 * Ceate Time 2024-04-09 17:10
 */
@Slf4j
public class ScopeDemoTest {
    public static void main (String[] args) {

        log.info ("========== 创建IOC容器开始==========");
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext (ScopeDemoConfig.class);
        log.info ("==========创建IOC容器结束==========");


        log.info ("==========IOC容器中获取Bean开始==========");

        ScopeSingletonDemo scopeSingletonDemo1 = context.getBean (ScopeSingletonDemo.class);
        ScopeSingletonDemo scopeSingletonDemo2 = context.getBean (ScopeSingletonDemo.class);

        log.info ("**************** scopeSingletonDemo1是否等于scopeSingletonDemo2 : {}", (scopeSingletonDemo1 == scopeSingletonDemo2));

        ScopePrototypeDemo scopePrototypeDemo1 = context.getBean (ScopePrototypeDemo.class);
        ScopePrototypeDemo scopePrototypeDemo2 = context.getBean (ScopePrototypeDemo.class);
        log.info ("**************** scopePrototypeDemo1是否等于scopePrototypeDemo2 : {}", (scopePrototypeDemo1 == scopePrototypeDemo2));

        log.info ("==========从IOC容器中获取Bean结束==========");
        context.close ();
    }
}

运行结果




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1581057.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Node2Vec论文翻译

node2vec: Scalable Feature Learning for Networks node2vec&#xff1a;可扩展的网络特征学习 ABSTRACT 网络中节点和边缘的预测任务需要在学习算法使用的工程特征上付出仔细的努力。最近在更广泛的表示学习领域的研究通过学习特征本身在自动化预测方面取得了重大进展。然…

win:Ollama安装和大模型的集成

一、Ollama介绍 Ollama 是一个用于在本地运行大型语言模型 (LLM) 的开源框架。它支持多种平台&#xff0c;包括 Windows、Linux 和 macOS。 Ollama 的主要功能包括&#xff1a; 将 LLM 模型转换为可执行文件 提供简单的命令行界面来运行 LLM 模型 支持多种 LLM 模型&#x…

P8602 [蓝桥杯 2013 省 A] 大臣的旅费【树的直径】

P8602 [蓝桥杯 2013 省 A] 大臣的旅费 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include<iostream> #include <algorithm> #include <vector> using namespace std; #define int long long const int N5e5100; int n; int res0; typedef pair<int,…

盘点业务流程管理认证,第3个最权威,考的人最多!

在当今竞争激烈的商业环境中&#xff0c;有效的业务流程管理变得至关重要。为了在这个领域取得成功&#xff0c;拥有相关的认证已经成为一种必要的资格。 市场上目前流行的业务流程管理认证&#xff0c;我总结了3个&#xff0c;分别是&#xff1a;BRMP业务关系管理认证、Lean …

:-1: error: Project ERROR: msvc-version.conf loaded but QMAKE_MSC_VER isn‘t set

qt报错 错误1 : error: Project ERROR: msvc-version.conf loaded but QMAKE_MSC_VER isnt set 错误1 : error: Project ERROR: msvc-version.conf loaded but QMAKE_MSC_VER isn’t set bug的现象:qtcreator无法通过点击pro文件来打开项目 方法:参考 根据上面的参考,我么找到…

谷歌浏览器变黑色背景 扩展程序 Hacker Vision

这个扩展程序能够把浏览器的背景变成黑色&#xff0c;长时间阅读文章的时候护眼效果很不错 效果如下

聚焦价值提升与市场扩张,ATFX任命Ergin Erdemir为拉丁美洲地区负责人

日前&#xff0c;全球知名品牌ATFX宣布一项重磅人事任命&#xff0c;Ergin Erdemir履新拉丁美洲地区负责人。我们相信通过这一重要战略举措&#xff0c;能够加强品牌在全球最具活力地区之一的拉美业务增长的承诺&#xff0c;并巩固品牌在当地的知名度和影响力。 Ergin Erdemi…

Java考题讲解一共5套,也可以在线刷题

【拯救者】Java刷题训练(二级专升本期末自考必备) &#x1f4d9;巩固基础 &#x1f4dc;知道考点 狠狠提分⬆️ (二级专升本期末自考必备) 大纲 一共5套题,每套可以先看视频,然后刷题. 末尾汇总了5套选择 填空 判断题, 优点: 可以查看解析和错题

[C++][算法基础]字符串统计(Trie树)

维护一个字符串集合&#xff0c;支持两种操作&#xff1a; I x 向集合中插入一个字符串 x&#xff1b;Q x 询问一个字符串在集合中出现了多少次。 共有 N 个操作&#xff0c;所有输入的字符串总长度不超过 &#xff0c;字符串仅包含小写英文字母。 输入格式 第一行包含整数…

应用配置不用愁,CRMEB Pro版新功能贴心保障

“配置系统应用时&#xff0c;没设置过的还得去搜教程&#xff0c;有些细节不了解还很容易设置错误&#xff0c;又得从头再来&#xff0c;真的好麻烦&#xff01;” “还有一些系统的设置&#xff0c;只说明了上传的素材类型和规格&#xff0c;根本不清楚到底是哪个地方的&…

大模型技术应用实训室解决方案

一、建设背景 随着大数据、云计算等技术的不断进步&#xff0c;大模型技术已成为人工智能领域的重要研究方向&#xff0c;其在自然语言处理、计算机视觉、语音识别等领域展现出强大的应用潜力。自2022年11月ChatGPT问世以来&#xff0c;大模型开始备受关注&#xff0c;科技巨头…

自偏置电流镜、wilson和cascode电流镜、低压自偏置电流镜

1.自偏置电流镜 参考1&#xff1a;正确偏置和自启动电路 正确偏置&#xff1a; 2.自启动电路 参考2&#xff1a;两种自启动电路、cascode低压设计、自启动充放电过程分析 3.低压自偏置电流镜 参考3&#xff1a;电阻偏置分析 VbVgs3VodVgs1Vod 4.电阻偏置和MOS偏置的分…

【攻防世界】easyphp(PHP代码审计)

进入题目环境&#xff0c;检查页面内容&#xff0c;页面附有源代码&#xff1a; <?php highlight_file(__FILE__); $key1 0; $key2 0;$a $_GET[a]; $b $_GET[b];if(isset($a) && intval($a) > 6000000 && strlen($a) < 3){if(isset($b) &&a…

棋牌室计时吧台计费收费灯控管理系统软件操作流程

棋牌室计时吧台计费收费灯控管理系统软件操作流程 一、前言 以下软件操作教程以&#xff0c;佳易王棋牌桌球计时计费管理系统软件灯控版V17.87为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 该计时计费软件可以是棋牌和桌球混合同时计时计费 …

Unity自己实现的中英文的切换(简单好抄)

关键技术&#xff08;读取文件的方法&#xff0c;Split()分割字符串&#xff09; 1.搭建一个这样的场景&#xff0c;场景中有3个文本&#xff08;用新版的&#xff09;&#xff0c;一个空对象&#xff0c;一个按钮 2.编写翻译文本&#xff08;编写一个txt文本&#xff0c;在文…

调用paddleocr实现中文文字识别

文章目录 paddleocr简介paddleocr安装paddleocr使用 paddleocr简介 飞桨首次开源文字识别模型套件PaddleOCR&#xff0c;目标是打造丰富、领先、实用的文本识别模型/工具库。 最新开源的超轻量PP-OCRv3模型大小仅为16.2M。同时支持中英文识别&#xff1b;支持倾斜、竖排等多种…

VueRouter的介绍:什么是路由呢?VueRouter的作用及使用,VueRouter的使用分为5个步骤和特定的2步

1.什么是路由呢&#xff1f; 路由就是路径和组件之间的映射关系&#xff0c;当我们路径变化的时候&#xff0c;就要切换对应的组件。 在前端中解决路径与组件之间的映射关系&#xff0c;官方提供了VueRouter这个插件 2.VueRouter的作用及使用 作用&#xff1a;修改地址栏路…

三角测量法恢复深度

参考&#xff1a;单目vo中的深度确定方法--三角测量_单目相机三角测量-CSDN博客 方法一&#xff1a;直接法 由于我们已经通过本质矩阵分解或者单应矩阵分解获得了R与t&#xff0c;此时想求的是两个特征点的深度 bool depthFromTriangulation(const SE3& T_search_ref,co…

CSS-文本域和输入框美化处理、文字和图片对齐、文字超出文本域以省略号显示、magin的运用

文本域和输入框美化处理 调整边框和背景&#xff1a; input[type"text"], textarea {border: 1px solid #ccc;border-radius: 5px;background-color: #f9f9f9;padding: 5px; }调整字体和颜色&#xff1a; input[type"text"], textarea {font-family: Ar…

【C语言】扫雷小游戏

文章目录 前言一、游戏玩法二、创建文件test.c文件menu()——打印菜单game()——调用功能函数&#xff0c;游戏的实现main()主函数 game.c文件初始化棋盘打印棋盘随机布置雷的位置统计周围雷的个数展开周围一片没有雷的区域计算已排查位置的个数排查雷(包括检测输赢): game.h文…