Spring中@Scope的几种取值方式

网友投稿 362 2022-07-23


目录@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 + '\'' +

// CEubSMQK '}';

// }

}

测试代码

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.ClassPathXCEubSMQKmlApplicationContext;

puCEubSMQKblic 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的垃圾回收了


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:使用Maven中的scope总结
下一篇:Java调用第三方http接口的常用方式总结
相关文章

 发表评论

暂时没有评论,来抢沙发吧~