Spring中@Scope的几种取值方式

目录
  • @Scope的几种取值
  • Spring入门详解scope属性
    • 一、scope属性
    • 二、scope分类
    • 三、scope取值

@Scope的几种取值

1、singleton:一个Spring容器中只有一个Bean的实例,此为Spring的默认配置,全容器共享一个实例

2、prototype:每次调用新建一个Bean的实例

3、Request:Web项目中,给每一个http request新建一个Bean实例

4、Session:Web项目中,给每一个http session新建一个Bean实例。

5、GlobalSession:这个只在portal应用中有用,给每一个global http session新建一个Bean实例。

Spring入门详解scope属性

一、scope属性

spring中scope是一个非常关键的概念,简单说就是对象在spring容器(IOC容器)中的生命周期,也可以理解为对象在spring容器中的创建方式。

二、scope分类

目前,scope的取值有5种取值:

在Spring 2.0之前,有singleton和prototype两种;

在Spring 2.0之后,为支持web应用的ApplicationContext,增强另外三种:request,session和global session类型,它们只实用于web程序,通常是和XmlWebApplicationContext共同使用。

三、scope取值

1.singleton

此取值时表明容器中创建时只存在一个实例,所有引用此bean都是单一实例。用代码实例

代码如下(示例):

Student类

package entity;
public class Student {
    private int studentNo;
    private String studentName;
    public Student() {
        System.out.println("无参构造函数被使用");
    }
    public int getStudentNo() {
        return studentNo;
    }
    public void setStudentNo(int studentNo) {
        this.studentNo = studentNo;
    }
    public String getStudentName() {
        return studentName;
    }
    public void setStudentName(String studentName) {
        this.studentName = studentName;
    }
//    @Override
//    public String toString() {
//        return "Student{" +
//                "studentNo=" + studentNo +
//                ", studentName='" + studentName + '\'' +
//                '}';
//    }
}

测试代码

package test;
import entity.Student;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringTest {
    @Test
//    测试scope属性,scope="singleton"
    public void test1(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Student student1= (Student) context.getBean("student");
        Student student2= (Student) context.getBean("student");
//        测试student1,h和student2d的地址是否一致
        System.out.println(student1);
        System.out.println(student2);
//        当 scope="singleton"
        /**输出结果地址一致(哈希值)
          *无参构造函数被使用
         * entity.Student@78186a70
         * entity.Student@78186a70
         */
    }
}

在输出的结果中我们可以看出,当设置为singleton时,加载的两个Student的哈希值一致,同时无参构造函数被调用一次,如果通过断点测试可以发现在加载文件时,无参构造函数就已经被调用(如下图)

总结:Bean的实例化的个数:1个

  • bean的实例化时机:当spring核心文件被加载是,实例化配置的bean实例。
  • 对象运行;只要容器在对象就一直活着
  • 对象销毁:当应用卸载或者销毁容器时,对象被销毁

接着我们再看prototype

2.prototype

代码如下(示例):

package test;
import entity.Student;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringTest {
    @Test
//    测试scope属性,scope="singleton"
    public void test1(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        Student student1= (Student) context.getBean("student");
        Student student2= (Student) context.getBean("student");
//        测试student1,h和student2d的地址是否一致
        System.out.println(student1);
        System.out.println(student2);
//     当   scope="prototype"
        /**
         * 输出结果
         * 无参构造函数被使用
         * 无参构造函数被使用
         * entity.Student@67b467e9
         * entity.Student@47db50c5
         *
         */
    }
}

首先在测试结果中,我们可以看出,两个Student的哈希值不一致,而且无参构造函数被执行了两次,接着我们在用断点测试一下

从测试的结果来看,此时的无参构造函数是在实例化Student的时候被调用的。我看到过一个大佬举的一个例子,我来引用一下 “如同分苹果,将苹果的bean的scope属性声明为prototype,在每个人领取苹果的时候,我们都是发一个新的苹果给他,发完之后,别人爱怎么吃就怎么吃,爱什么时候吃什么时候吃,但是注意吃完要把苹果核扔到垃圾箱!对于那些不能共享使用的对象类型,应该将其定义的scope设为prototype。”

总结:Bean的实例化的个数:多个

  • bean的实例化时机:当spring核心文件被加载是,实例化配置的bean实例。
  • 对象运行;只对象在就一直活着
  • 对象销毁:当对象长时间不用时,被java的垃圾回收了

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 使用Spring中的scope配置和@scope注解

    目录 Spring的scope配置和@scope注解 1. Spring的作用域在装配Bean 2. 基于注解开发时 Spring中的scope详解 1. scope概论 2. scope历史及分类 3. 单个scope详解 4. scope配置 Spring的scope配置和@scope注解 Scope,也称作用域,在 Spring IoC 容器是指其创建的 Bean 对象相对于其他 Bean 对象的请求可见范围. 在 Spring IoC 容器中具有以下几种作用域: 基本作用域(single

  • Maven中optional和scope元素的使用弄明白了吗

    在梳理项目的过程中发现很多开发同学对 Maven 依赖文件的配置并不了解,特别是对 Maven 的 optional 元素和 scope 元素的使用也非常随意.这就会导致发布的 jar 包或 war 包非常 "胖".编译速度慢,而且还很容易生产 jar 冲突等问题.本篇文章从 optional 和 scope 的使用场景入手,让项目实现一波瘦身. optional 元素 这里以 Spring Boot 项目中的使用为例,比如我们在项目中经常使用的热部署组件 spring-boot-de

  • 使用Maven中的scope总结

    目录 Maven中的scope总结 Maven中的scope主要有以下6种 Maven中<scope>参数</scope>配置 解决maven项目中无法打包生成空文件夹的问题 Maven中的scope总结 Maven中的scope主要有以下6种 接下来分别介绍下这几种scope: compile 不声明scope元素的情况下的默认值:compile表示被依赖包需要参与当前项目的编译,包括后续的测试,运行周期也参与其中,是一个比较强的依赖:打包的时候通常需要包含进去. provide

  • 解决@Scope(“prototype“)不生效的问题

    目录 @Scope(“prototype“)不生效 @Scope(“prototype“)正确用法——解决Bean多例问题 1.问题,Spring管理的某个Bean需要使用多例 2.问题升级 3. Spring给出的解决问题的办法(解决Bean链中某个Bean需要多例的问题) @Scope(“prototype“)不生效 使用spring的时候,我们一般都是使用@Component实现bean的注入,这个时候我们的bean如果不指定@Scope,默认是单例模式,另外还有很多模式可用,用的最多的就

  • maven依赖关系中的<scope>provided</scope>使用详解

    关于maven依赖中的<scope>provided</scope>使用 scope的其他参数如下: compile 默认的scope,表示 dependency 都可以在生命周期中使用.而且,这些dependencies 会传递到依赖的项目中.适用于所有阶段,会随着项目一起发布 provided 跟compile相似,但是表明了dependency 由JDK或者容器提供,例如Servlet AP和一些Java EE APIs.这个scope 只能作用在编译和测试时,同时没有传递性

  • Spring中@Scope的几种取值方式

    目录 @Scope的几种取值 Spring入门详解scope属性 一.scope属性 二.scope分类 三.scope取值 @Scope的几种取值 1.singleton:一个Spring容器中只有一个Bean的实例,此为Spring的默认配置,全容器共享一个实例 2.prototype:每次调用新建一个Bean的实例 3.Request:Web项目中,给每一个http request新建一个Bean实例 4.Session:Web项目中,给每一个http session新建一个Bean实例.

  • MyBatis中foreach标签的collection属性的取值方式

    目录 foreach标签的collection属性的取值 传的是List列表 传的是Array数组 传的是Map collection属性总结 MyBatis使用foreach标签报错 原因 解决方案 foreach标签的collection属性的取值 传的是List列表 接口代码 List<Emp> findEmpByDeptnos(List<Integer> deptnos); xml配置代码 <select id="findEmpByDeptnos"

  • Java中常见的日期操作(取值、转换、加减、比较)

    Java 的开发过程中免不了与 Date 类型纠缠,准备总结一下项目经常使用的日期相关操作,JDK 版本 1.7,如果能够帮助大家节约那么几分钟起身活动一下,去泡杯咖啡,便是极好的,嘿嘿.当然,我只提供了可行的解决方案,并不保证是最佳实践,欢迎讨论. 1. 日期取值 在旧版本 JDK 的时代,有不少代码中日期取值利用了 java.util.Date 类,但是由于 Date 类不便于实现国际化,其实从 JDK1.1 开始,就更推荐使用 java.util.Calendar 类进行时间和日期方面的处

  • 浅谈spring中scope作用域

    今天研究了一下scope的作用域.默认是单例模式,即scope="singleton".另外scope还有prototype.request.session.global session作用域.scope="prototype"多例.再配置bean的作用域时,它的头文件形式如下: 如何使用spring的作用域: <bean id="role" class="spring.chapter2.maryGame.Role" s

  • Vue数组中出现__ob__:Observer无法取值问题的解决方法

    目录 问题说明 解决问题 结果图 总结 问题说明 在开发项目中经常要从数据库中拿到数组然后复制给新的数组使用,但是会发现有时候会发现带有 __ob__: Observer 数组后缀的就是没有办法取到值,更可怕的是 console.log 却能看得到值.数组如下图所示: 解决问题 那么针对这样的问题博客上基本上都是说要将数组转化成string对象运用这个JSON.parse(JSON.stringify(数组))再进行赋值,然后一顿操作数组变成空!!! 说实话根本不是这个原因,哎被坑了一下午! 那

  • Spring中Bean的三种实例化方式详解

    目录 一.环境准备 二.构造方法实例化 三.分析Spring的错误信息 四.静态工厂实例化 4.1 工厂方式创建bean 4.2 静态工厂实例化 五.实例工厂与FactoryBean 5.1 环境准备 5.2 实例工厂实例化 5.3 FactoryBean的使用 六.bean实例化小结 一.环境准备 准备开发环境 创建一个Maven项目 pom.xml添加依赖 resources下添加spring的配置文件applicationContext.xml 最终项目的结构如下: 二.构造方法实例化 在

  • webpack output.library的16 种取值方法示例

    目录 前置准备 不配置 library library.type = var(默认值) library.type = window library.type = module library.type = this library.type = self library.type = global library.type = commonjs library.type = commonjs2 library.type = commonjs-static library.type = amd l

  • C语言中四种取整方式,取余/取模运算以及负数取模问题详解

    目录 零向取整.负无穷向取整.正无穷向取整.四舍五入取整 总结 零向取整.负无穷向取整.正无穷向取整.四舍五入取整 如果将一个浮点数赋值给整形,只会保存整数位: 这种取整方式为零向取整,C语言默认采用的是这种方式 C语言中也有对应的零向取整函数: 同理还有一种函数是负无穷大取整: 它的取整方案是向负无穷大取整: 有地板取整,当然也有正无穷大取整的函数: 它的取整方式是向正无穷大取整: 最后,还有四舍五入取整的函数: 取模/取余 取模概念: 如果a和d是两个自然数,d非零,可以证明存在两个唯一的整

  • jQuery中ajax的4种常用请求方式介绍

    AJAX 是一种与服务器交换数据的技术,可以在补充在整个页面的情况下更新网页的一部分. jQuery中ajax的4种常用请求方式: 1.$.ajax()返回其创建的 XMLHttpRequest 对象. $.ajax() 只有一个参数:参数 key/value 对象,包含各配置及回调函数信息.详细参数选项见下. 如果你指定了 dataType 选项,请确保服务器返回正确的 MIME 信息,(如 xml 返回 "text/xml"). 实例: 保存数据到服务器,成功时显示信息. $.aj

  • appium中常见的几种点击方式

    目录 1.最常见的点击方式click()方法 2.手指轻敲屏幕操作tap()方法 3.手指按下操作press()方法 4.模拟手指长按操作long_press()方法 首先从appium库里面导入webdriver,然后webdriver.Remote()声明driver对象.想要使用TouchAction,必须要创建TouchAction对象,通过对象调用想要执行的手势,通过perform()执行动作. #导入TouchAction from appium.webdriver.common.t

随机推荐