首页 > 其他分享 >【spring】@Scope注解学习

【spring】@Scope注解学习

时间:2024-04-09 17:59:23浏览次数:25  
标签:作用域 spring bean Bean 实例 Scope 注解 public

@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 ();
    }
}

运行结果




标签:作用域,spring,bean,Bean,实例,Scope,注解,public
From: https://blog.csdn.net/wochunyang/article/details/137559018

相关文章

  • Spring AOP 技术详解
    学完AOP技术,真的不得不佩服发明AOP技术的人,真是个天才!!!想要了解AOP,首先要了解什么叫代理。1.代理我们先来说说什么叫做代理:        假如我要买辆奥迪A7,我不会直接去长春一汽工厂去买,为啥?路途远,而且,如果以这样方式购买,一手交钱,一手交车,事先没人给我介绍车辆配置情况......
  • 两种方式实现SpringBoot脚手架的依赖配置
    在基于SpringBoot脚手架创建项目时,通常会直接将spring-boot-starter-parent作为<parent>,如下示例:<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.10</vers......
  • Spring深度学习:循环依赖及源码解析
    文章目录Spring深度学习:循环依赖及源码解析一、序言二、问题原因三、解决方案1.普通Bean对象循环依赖解决2.AOP代理场景下循环依赖解决3.AOP代理场景下多依赖解决四、源码分析:流程①:实例化对象A后,将对象A的工厂对象放入三级缓存流程②:对象A依赖对象B,在缓存中查找对象B流......
  • spring-LocalVariableTableParameterNameDiscoverer
    记录一下后期整理注:此工具类是解析class文件从class文件获取,而不是通过元空间的class对象的method获取 /***在jdk8以前java源码编译后通过反射是无法获得形参名的,在Java8及之后,编译的时候可以通过-parameters为反射生成元信息,可以获取到方法的参数名,但这......
  • idea配置springmvc项目
    传统的web项目(含有webroot文件夹)导入IDEA需要做的一系列配置_ideawebroot-CSDN博客IDEA部署以往的springmvc项目,用外部Tomcat部署---精简版,几步操作完成_springmvc用外置的tomcat-CSDN博客参考这位博主的内容成功配置需要修改的是默认启动文件出现新的问题,js和css文件不好使,......
  • Vue2 + Spring Boot的题库管理和在线考试系统
    一个demo从0到1的搭建~使用mybatisplus快速开发springboot项目(一)--初始化-CSDN博客使用mybatisplus快速开发springboot项目(二)--业务实现_如何用mybatis-plus写业务-CSDN博客使用mybatisplus快速开发springboot项目(三)--JWT拦截器-CSDN博客使用mybatisplus快速开发springboot......
  • Springboot 添加License 以及生成证书和证书验证
    1.先准备生成cer证书及私钥,公钥##(1).生成私匙库#validity:私钥的有效期多少天 365 #alias:私钥别称 privateKey#keystore:指定私钥库文件的名称(生成在当前目录) privateKeys.keystore#storepass:指定私钥库的密码(获取keystore信息所需的密码) public_password#key......
  • Springboot计算机毕业设计海滨学院校园墙小程序【附源码】开题+论文+mysql+程序+部署
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容计算机毕业设计海滨学院校园墙小程序研究背景、意义、目的研究背景随着移动互联网技术的快速发展,微信小程序以其便捷性、即用即走的特点,迅速渗透到人们的日......
  • Springboot计算机毕业设计购物商城微信小程序【附源码】开题+论文+mysql+程序+部署
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容计算机毕业设计购物商城微信小程序的研究背景、意义、目的研究背景随着互联网技术的迅猛发展,移动智能终端的普及率不断攀升,微信小程序以其便捷性、轻量级的......
  • 基于SpringBoot+Vue大学生租房平台的设计与实现
    基于SpringBoot+Vue大学生租房平台的设计与实现系统介绍基于SpringBoot+Vue大学生租房平台使用Java语言进行编码,使用Mysql创建数据表保存本系统产生的数据。系统可以提供信息显示和相应服务,其管理员管理房东和用户,对房东提交的信息审批信息进行审核,审核房东发布的房源信......