Spring中@Scope的几种取值方式

 更新时间:2022年06月15日 09:27:00   作者:to.to  
这篇文章主要介绍了Spring中@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的垃圾回收了

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

相关文章

  • Java链表中元素删除的实现方法详解【只删除一个元素情况】

    Java链表中元素删除的实现方法详解【只删除一个元素情况】

    这篇文章主要介绍了Java链表中元素删除的实现方法,结合实例形式分析了java只删除链表中一个元素的相关操作原理、实现方法与注意事项,需要的朋友可以参考下
    2020-03-03
  • SpringBoot中进行事务回滚的方法

    SpringBoot中进行事务回滚的方法

    在Spring Boot中,可以使用TransactionTemplate或@Transactional注解来进行事务管理,本文主要介绍了SpringBoot中进行事务回滚的方法,感兴趣的可以了解一下
    2023-11-11
  • SpringBoot整合Lombok及常见问题解决

    SpringBoot整合Lombok及常见问题解决

    本文主要介绍了SpringBoot整合Lombok及常见问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • 基于Java实现简易的局域网对话系统

    基于Java实现简易的局域网对话系统

    这篇文章主要介绍了基于Java实现的简易的局域网对话系统,文中的示例代码对我们学习Java有一定的帮助,感兴趣的小伙伴快来跟随小编一起学习一下吧
    2021-12-12
  • Java如何发起http请求的实现(GET/POST)

    Java如何发起http请求的实现(GET/POST)

    这篇文章主要介绍了Java如何发起http请求的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Java中对象快速复制的几种方式详解

    Java中对象快速复制的几种方式详解

    这篇文章主要介绍了Java中对象快速复制的几种方式详解,对象的克隆是指创建一个新的对象,且新的对象的状态与原始对象的状态相同,当对克隆的新对象进行修改时,不会影响原始对象的状态,需要的朋友可以参考下
    2023-08-08
  • Spring Boot 3.4.0 结合 Mybatis-plus 实现动态数据源的完整方案

    Spring Boot 3.4.0 结合 Mybatis-plus 实

    本文详细介绍了在 Spring Boot 3.4.0 项目中结合 Mybatis-plus 实现动态数据源切换的完整方案,通过自定义注解和AOP切面,我们可以优雅地实现方法级别的数据源切换,满足多数据源场景下的各种需求,感兴趣的朋友一起看看吧
    2025-04-04
  • Spring Bean生命周期之Bean元信息的配置与解析阶段详解

    Spring Bean生命周期之Bean元信息的配置与解析阶段详解

    这篇文章主要为大家详细介绍了Spring Bean生命周期之Bean元信息的配置与解析阶段,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • 一篇文章带你使用SpringBoot基于WebSocket的在线群聊实现

    一篇文章带你使用SpringBoot基于WebSocket的在线群聊实现

    这篇文章主要介绍了一篇文章带你使用SpringBoot基于WebSocket的在线群聊实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • java实现订餐系统

    java实现订餐系统

    这篇文章主要为大家详细介绍了java实现订餐系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07

最新评论