当前位置: 首页 > news >正文

【spring】@Scope注解学习

@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 ();}
}
运行结果




相关文章:

  • 神经网络解决回归问题(更新ing)
  • 属于我们Go语言的toString!
  • UVA230 Borrowers 图书管理系统 解题报告
  • 谈谈Python中的单元测试和集成测试
  • Docker内更新Jenkins详细讲解
  • 如何使用Arduino IDE对STM32F103C8T6进行编程
  • 比较好玩的车子 高尔夫6
  • TCP-IP详解卷一:协议——阅读总结
  • UML学习
  • ORAN C平面 Section Extension 22
  • Flutter之TabBar篇
  • hive管理之ctl方式
  • spring test配合junit4 实现单元测试
  • OpenAI曾转录100万小时视频数据,训练GPT-4
  • Java每日一题(三道同一类型的题)
  • Google 是如何开发 Web 框架的
  • Android系统模拟器绘制实现概述
  • es的写入过程
  • Fastjson的基本使用方法大全
  • jquery cookie
  • jQuery(一)
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • Vue--数据传输
  • Windows Containers 大冒险: 容器网络
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 从零开始在ubuntu上搭建node开发环境
  • 警报:线上事故之CountDownLatch的威力
  • 三栏布局总结
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 什么是Javascript函数节流?
  • 阿里云ACE认证学习知识点梳理
  • 阿里云重庆大学大数据训练营落地分享
  • 从如何停掉 Promise 链说起
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • $NOIp2018$劝退记
  • (1)Android开发优化---------UI优化
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (十一)c52学习之旅-动态数码管
  • (一)kafka实战——kafka源码编译启动
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)可以带来幸福的一本书
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .gitignore文件_Git:.gitignore
  • .NET delegate 委托 、 Event 事件
  • .Net Winform开发笔记(一)
  • .NET/C# 使用反射注册事件
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .NET运行机制