Spring Bean 作用域

转载自  Spring Bean 作用域

Bean 的作用域

当在 Spring 中定义一个 bean 时,你必须声明该 bean 的作用域的选项。例如,为了强制 Spring 在每次需要时都产生一个新的 bean 实例,你应该声明 bean 的作用域的属性为 prototype。同理,如果你想让 Spring 在每次需要时都返回同一个bean实例,你应该声明 bean 的作用域的属性为 singleton

Spring 框架支持以下五个作用域,如果你使用 web-aware ApplicationContext 时,其中三个是可用的。

作用域描述
singleton

在spring IoC容器仅存在一个Bean实例,Bean以单例方式存在,默认值

prototype每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行newXxxBean()
request每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境
session同一个HTTP Session共享一个Bean,不同Session使用不同的Bean,仅适用于WebApplicationContext环境
global-session一般用于Portlet应用环境,改作用于仅适用于WebApplicationContext环境

本章将讨论前两个范围,当我们将讨论有关 web-aware Spring ApplicationContext 时,其余三个将被讨论。

singleton 作用域:

当一个bean的作用域为Singleton,那么Spring IoC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。

Singleton是单例类型,就是在创建起容器时就同时自动创建了一个bean的对象,不管你是否使用,他都存在了,每次获取到的对象都是同一个对象。注意,Singleton作用域是Spring中的缺省作用域。你可以在 bean 的配置文件中设置作用域的属性为 singleton,如下所示:

<!-- A bean definition with singleton scope -->
<bean id="..." class="..." scope="singleton"><!-- collaborators and configuration for this bean go here -->
</bean>

例子

我们在适当的位置使用 Eclipse IDE,然后按照下面的步骤来创建一个 Spring 应用程序:

步骤描述
1创建一个名称为 SpringExample 的项目,并且在创建项目的 src 文件夹中创建一个包 com.tutorialspoint
2使用 Add External JARs 选项,添加所需的 Spring 库,在 Spring Hello World Example 章节解释。
3在 com.tutorialspoint 包中创建 Java 类 HelloWorld 和 MainApp
4在 src 文件夹中创建 Beans 配置文件 Beans.xml
5最后一步是创建的所有 Java 文件和 Bean 配置文件的内容,并运行应用程序,解释如下。

这里是 HelloWorld.java 文件的内容:

package com.tutorialspoint;
public class HelloWorld {private String message;public void setMessage(String message){this.message  = message;}public void getMessage(){System.out.println("Your Message : " + message);}
}

下面是 MainApp.java 文件的内容:

package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");HelloWorld objA = (HelloWorld) context.getBean("helloWorld");objA.setMessage("I'm object A");objA.getMessage();HelloWorld objB = (HelloWorld) context.getBean("helloWorld");objB.getMessage();}
}

下面是 singleton 作用域必需的配置文件 Beans.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd"><bean id="helloWorld" class="com.tutorialspoint.HelloWorld" scope="singleton"></bean></beans>

一旦你创建源代码和 bean 配置文件完成后,我们就可以运行该应用程序。如果你的应用程序一切都正常,将输出以下信息:

Your Message : I'm object A
Your Message : I'm object A

prototype 作用域

当一个bean的作用域为Prototype,表示一个bean定义对应多个对象实例。Prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例。Prototype是原型类型,它在我们创建容器的时候并没有实例化,而是当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象。根据经验,对有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。

为了定义 prototype 作用域,你可以在 bean 的配置文件中设置作用域的属性为 prototype,如下所示:

<!-- A bean definition with singleton scope -->
<bean id="..." class="..." scope="prototype"><!-- collaborators and configuration for this bean go here -->
</bean>

例子

我们在适当的位置使用 Eclipse IDE,然后按照下面的步骤来创建一个 Spring 应用程序:

步骤描述
1创建一个名称为 SpringExample 的项目,并且在创建项目的 src 文件夹中创建一个包com.tutorialspoint
2使用 Add External JARs 选项,添加所需的 Spring 库,解释见 Spring Hello World Example 章节。
3在 com.tutorialspoint 包中创建 Java 类 HelloWorld 和 MainApp
4在 src 文件夹中创建 Beans 配置文件Beans.xml
5最后一步是创建的所有 Java 文件和 Bean 配置文件的内容,并运行应用程序,解释如下所示。

这里是 HelloWorld.java 文件的内容:

package com.tutorialspoint;public class HelloWorld {private String message;public void setMessage(String message){this.message  = message;}public void getMessage(){System.out.println("Your Message : " + message);}
}

下面是 MainApp.java 文件的内容:

package com.tutorialspoint;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");HelloWorld objA = (HelloWorld) context.getBean("helloWorld");objA.setMessage("I'm object A");objA.getMessage();HelloWorld objB = (HelloWorld) context.getBean("helloWorld");objB.getMessage();}
}

下面是 prototype 作用域必需的配置文件 Beans.xml:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd"><bean id="helloWorld" class="com.tutorialspoint.HelloWorld" scope="prototype"></bean></beans>

一旦你创建源代码和 Bean 配置文件完成后,我们就可以运行该应用程序。如果你的应用程序一切都正常,将输出以下信息:

Your Message : I'm object A
Your Message : null

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/326713.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 计算两个时间相差的天,时,分钟,秒

public static String getDateTimePoor( Date startDate ,Date endDate ) {long nd 1000 * 24 * 60 * 60;long nh 1000 * 60 * 60;long nm 1000 * 60;// long ns 1000;// 获得两个时间的毫秒时间差异long diff endDate.getTime() - startDate.getTime();// 计算差多少天lo…

用赫夫曼树进行文件的压缩

思路分析 代码实现 package com.atguigu.huffmancode;import com.sun.org.glassfish.external.statistics.CountStatistic; import com.sun.org.glassfish.external.statistics.StringStatistic;import javax.xml.bind.SchemaOutputResolver; import java.io.*; import java.s…

廖雪峰python教程整理笔记_廖雪峰python教程笔记(一)

变量与变量名 如 a 123&#xff0c;此时&#xff0c;python解释器在做了两件事&#xff0c;在内存中创建了一个整数123对象&#xff0c;在内存中创建了一个名为a的变量。并把它指向123&#xff0c;一个赋值语句被执行后&#xff0c;内存中一个变量名与它所指向的对象就是一对一…

.NET跨平台之旅:博问站点迁移至ASP.NET Core on Linux并发布上线

Powered by ASP.NET Core on Linux&#xff01; 我们全站的 .NET Core 迁移工作如火如荼&#xff0c;这是我们今年上半年的重要工作。 今天我们终于完成了博问产品&#xff08;q.cnblogs.com&#xff09;向 ASP.NET Core 的迁移&#xff0c;并已发布上线。如果您在博问页面的页…

用赫夫曼树进行文件解压

思路分析 代码实现 package com.atguigu.huffmancode;import com.sun.org.glassfish.external.statistics.CountStatistic; import com.sun.org.glassfish.external.statistics.StringStatistic;import javax.xml.bind.SchemaOutputResolver; import java.io.*; import java.s…

Spring Bean 后置处理器

转载自 Spring Bean 后置处理器 Spring——Bean 后置处理器 BeanPostProcessor 接口定义回调方法&#xff0c;你可以实现该方法来提供自己的实例化逻辑&#xff0c;依赖解析逻辑等。你也可以在 Spring 容器通过插入一个或多个 BeanPostProcessor 的实现来完成实例化&#xf…

python3 爬虫例子_如何让你写的爬虫速度像坐火箭一样快【并发请求】

开坑个新系列&#xff0c;主要面向新手&#xff0c;老司机可以忽略。这个系列内的文章将会让你知道如何做到让你写的爬虫在运行的时候速度能像火箭一样快&#xff01;很多初学爬虫的朋友对于这方面的知识似乎是空白的&#xff0c;甚至还有一些在爬虫岗位上工作了一两年的人也搞…

二叉排序树的删除+图解

图解 第一种情况 第二种情况 第三种情况 代码实现 package com.atguigu.binarysorttree;import com.sun.javafx.sg.prism.NGImageView; import javafx.scene.transform.Rotate;import java.io.InputStream; import java.util.Timer;/*** 创建人 wdl* 创建时间 2021/3/29* 描述…

如何一秒钟从头构建一个 ASP.NET Core 中间件

前言 其实地上本没有路&#xff0c;走的人多了&#xff0c;也便成了路。 -- 鲁迅 就像上面鲁迅说的那样&#xff0c;其实在我们开发中间件的过程中&#xff0c;微软并没有制定一些策略或者文档来约束你如何编写一个中间件程序&#xff0c; 但是其中却存在者一些最佳实践的方法&…

Spring Bean 定义继承

转载自 Spring Bean 定义继承 Bean 定义继承 bean 定义可以包含很多的配置信息&#xff0c;包括构造函数的参数&#xff0c;属性值&#xff0c;容器的具体信息例如初始化方法&#xff0c;静态工厂方法名&#xff0c;等等。 子 bean 的定义继承父定义的配置数据。子定义可以…

ssm(Spring+Spring mvc+mybatis)

在不久的之前我写了一篇ssh(SpringSpring mvchibernate)的文章&#xff0c;感兴趣的可以去这里看看~ 今天我来写一下ssm的增删改欧查案例&#xff1a; 数据库&#xff1a;mysql 浏览器&#xff1a;火狐浏览器 jdk&#xff1a;1.7 开发编辑器&#xff1a;myeclipse10.5 首…

grub shell 错误_使用grub-install修复Grub时出错

你的位置:问答吧-> Debian-> 问题详情使用grub-install修复Grub时出错WinXPDebian双系统&#xff0c;由于误操作导致开机后无法进入系统&#xff0c;错误信息为&#xff1a;GRUB Loading stage1.5.GRUB loading,please wait...error 22按照网上的说法&#xff0c;使用启动…

C# winform程序免安装.net framework在XP/win7/win10环境运行

前文&#xff1a; 首先感谢群里的大神宇内流云 提供的anyexec for windows版本。 经过本人搭建虚拟机在xp环境 使用anyexec运行winfrom程序后&#xff0c;测试通过,如下是用的xp运行winfrom程序的部分截图 下面是n年前入坑C#写的winform。。。玩毒奶粉用的&#xff0c;勿喷。 .…

ssm(Spring+Spring mvc+mybatis)实体类——Dept

package org.entity;/**.* * * 项目名称&#xff1a;test_ssm_16qn3 * 类名称&#xff1a;Dept * 类描述&#xff1a; 部门表实体类 * 创建人&#xff1a;Mu Xiongxiong * 创建时间&#xff1a;2017-12-26 下午8:30:55 * 修改人&#xff1a;Mu Xiongxiong …

Spring 基于构造函数的依赖注入

转载自 Spring 基于构造函数的依赖注入 Spring 基于构造函数的依赖注入 当容器调用带有一组参数的类构造函数时&#xff0c;基于构造函数的 DI 就完成了&#xff0c;其中每个参数代表一个对其他类的依赖。 示例&#xff1a; 下面的例子显示了一个类 TextEditor&#xff0c…

AVL树双旋转+图解

图解 代码实现 package com.atguigu.avl; /*** 创建人 wdl* 创建时间 2021/3/30* 描述*/ public class AVLTreeDemo {public static void main(String[] args) { // int[] arr{4,3,6,5,7,8};//创建一个AVLTree对象 // int arr[]{10,12,8,9,7,6};int[] arr{10,11…

ssm(Spring+Spring mvc+mybatis)Dao接口——IDeptDao

package org.dao;import java.util.List;import org.entity.Dept;/*** * * 项目名称&#xff1a;test_ssm_16qn3 * 类名称&#xff1a;IDeptDao * 类描述&#xff1a; 部门表的接口 * 创建人&#xff1a;Mu Xiongxiong * 创建时间&#xff1a;2017-12-26 下午8:…

Spring 基于设值函数的依赖注入

Spring 基于设值函数的依赖注入 当容器调用一个无参的构造函数或一个无参的静态 factory 方法来初始化你的 bean 后&#xff0c;通过容器在你的 bean 上调用设值函数&#xff0c;基于设值函数的 DI 就完成了。 示例&#xff1a; 下述例子显示了一个类 TextEditor&#xff0c…

[SSCore] 开源dotnet core 版本 SuperSocket

前言碎语 最近一直在做旧版本dotnet 程序迁移至dotnet core的工作, 非常欣慰dotnet社区的蓬勃发展, 目前大部分的第三方类库或开源代码都有了dotnet core版本 或者可以方便的找到替代方案. 这其中我唯一觉得遗憾的是dotnet 社区大名鼎鼎的socket 通讯框架SuperSocket SuperSock…

字母图形

资源限制 时间限制&#xff1a;1.0s 内存限制&#xff1a;256.0MB 问题描述 利用字母可以组成一些美丽的图形&#xff0c;下面给出了一个例子&#xff1a; ABCDEFG BABCDEF CBABCDE DCBABCD EDCBABC 这是一个5行7列的图形&#xff0c;请找出这个图形的规律&#xff0c;并…