Spring中的单例模式和多例模式的应用
在Spring的配置中,Bean的scope属性中存在两种模式:singleton(单例模式)、prototype(多例模式)
singleton 单例模式:对象在整个系统中只有一份,所有的请求都用一个对象来处理,如service和dao层的对象一般是单例的。
为什么使用单例:因为没有必要每个请求都新建一个对象的时候,因为这样会浪费CPU和内存。
prototype 多例模式:对象在整个系统中可以有多个实例,每个请求用一个新的对象来处理,如action。
为什么使用多例:防止并发问题;即一个请求改变了对象的状态,此时对象又处理另一个请求,而之前请求对对象的状态改变导致了对象对另一个请求做了错误的处理;
实例:
class User{
private int id;
private String name;
private List<String> hobby;
public void init(){
System.out.println("初始化方法!");
}
public void distroy(){
System.out.println("销毁方法!");
}
......get and set方法
}
接下来在applicationContext.xml中配置Spring,配置User的Bean
<Bean id="user" name="user" class="User" scope="singleton" init-methon="init" distroy-methon="distroy">
<property name="id" value="1"></property>
<property name="name" value="张三"></property>
<property name="hobby">
<list>
<value>打篮球</value>
<value>听歌</value>
</list>
</property>
</Bean>
Bean:该对象需要Spring来管理,将User对象交给Spring管理
id 和 name:做用是一样的,给Bean取一个名字,可以通过这个名字获取到这个对象。使用name的话不能使用特殊字符,尽量使用id。
class:完整的类名。也就是Bean对象所对应的类对象。
scope:singleto 或者prototype。
init-methon:初始化方法
distroy-methon:销毁方法
property:通过name给类中的属性赋值value。
如果这里name的类型为其它bean对象的映射可以写成
<property name="user">
<ref bean="user1"></ref> //这里是映射的bean的id或name为user1的bean
</property>
如果这里name的类型为集合类型,可以通过以上list例子对其进行赋值
类型为list和set,只需要将标签对改成对应的集合类型就可以。
如果类型为map
<map>
<entry key="A" value-ref="user1"></entry> //key为键,value-ref为bean的映射
</map>
这里通过property对类中的属性进行赋值可参考:https://blog.csdn.net/qq_21396469/article/details/63684769
编写测试类:
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class Demo {
@Test
public void test(){
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
User user = (User) ac.getBean("user");
User user1 = (User) ac.getBean("user");
System.out.println(user);
System.out.println(user1);
}
}
单例模式运行的结果:
初始化方法
User@60c7531f
User@60c7531f
多例模式运行的结果:
将scope改为prototype
初始化方法
初始化方法
User@5891e34
User@cb0ed20
Spring中的单例模式和多例模式的应用的更多相关文章
- Spring中的单例模式
Spring中的单例模式 单例模式的介绍 1.1 简介 保证整个应用中某个实例有且只有一个 1.2作用 保证一个类仅有一个实例,并且提供一个访问它的全局访问点. 单例模式的优点和缺点 单例模式的优 ...
- java单例模式和双例模式
今天朋友找我给做道题,双例模式,我是没听说过,都说是单例模式和多例模式, 也不知道双例模式什么时候用,就简单写了一个案例,不知道对不对,个人感觉蛮对的,双例就是单例+单例,废话不说了!!!! /* * ...
- Spring学习之路——单例模式和多例模式
在Spring中,bean可以被定义为两种模式:prototype(多例)和singleton(单例) singleton(单例):只有一个共享的实例存在,所有对这个bean的请求都会返回这个唯一的实 ...
- Spring 单例模式和多例模式
1.Spring中的对象默认都是 单例模式. 2.使用 @Scope("prototype") 注解来使对象成为多例模式. 3.通过@Autowired 注入的Service 或者 ...
- Spring中的设计模式:工厂方法模式
导读 工厂方法模式是所有设计模式中比较常用的一种模式,但是真正能搞懂用好的少之又少,Spring底层大量的使用该设计模式来进行封装,以致开发者阅读源代码的时候晕头转向. 文章首发于微信公众号[码猿技术 ...
- spring中如何向一个单例bean中注入非单例bean
看到这个题目相信很多小伙伴都是懵懵的,平时我们的做法大都是下面的操作 @Component public class People{ @Autowired private Man man; } 这里如 ...
- spring中的定时任务调度用例
在application-quartz.xml配置文件中添加如下配置信息: <!-- Quartz --> <bean id="getSendEmailObject ...
- Spring中常用的23中设计模式
1.spring 中常用的设计模式有23中 分类 设计模式 创建型 工厂方法模式(FactoryMethod).抽象工厂模式(AbstractFactory).建造者模式(Builder).原型 ...
- 在商城系统中使用设计模式----策略模式之在spring中使用策略模式
1.前言: 这是策略模式在spring中的使用,对策略模式不了解对同学可以移步在商城中简单对使用策略模式. 2.问题: 在策略模式中,我们创建表示各种策略的对象和一个行为,随着策略对象改变而改变的 c ...
随机推荐
- 转 MYSQL_GTID详解
http://blog.itpub.net/27067062/viewspace-2141906/ 一.GTID概述 GTID是MYSQL5.6新增的特性,GTID(Global Transac ...
- aop 切面配置
<bean id="userServiceImpl" class="com.bj.aop.xml.before.UserServiceImpl">& ...
- 迷你迅雷+SqlServer2008r2下载
迷你迅雷下载 http://down.sandai.net/mini/MiniThunderInstaller3.1.1.58.exe SqlServer 2008r2下载 ed2k://|file| ...
- 2009年3月新浪PHP面试题及答案(二)
1.请写出PHP5权限控制修饰符. 答案:private protected public. 2.对于大流量的网站,您采用什么样的方法来解决访问量问题? 答案:首先,确认服务器硬件是否足够支持当前的流 ...
- GitLab常用命令整理
进入本地仓库访问位置之后执行命令 1) 远程仓库相关命令 检出仓库:$ git clone git://github.com/jquery/jquery.git 查看远程仓库:$ git remote ...
- JavaSE之Java基础(3)
11.什么是值传递和引用传递? 值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参数的值. 引用传递:也称为传地址.方法调用时,实际参数的引用被传递给方法 ...
- 前端WEB编辑器-------webstrom
欲先善其事,必先利其器,如题.看到网上一篇介绍webstrom的文章,觉得功能确实强大,也知道为什么阿里巴巴的前端传到github上的文件为啥都有一个 .idea 文件,(传说淘宝内部推荐写js用we ...
- AngularJS(九):路由
本文也同步发表在我的公众号“我的天空” AngularJS路由 AngularJS路由可以让我们通过不同的URL访问不同页面(似乎是废话),其价值主要体现在单页面的web应用中(single page ...
- CF1152C Neko does Maths
思路: 假设a <= b,lcm(a + k, b + k) = (a + k) * (b + k) / gcd(a + k, b + k) = (a + k) * (b + k) / gcd( ...
- javascript中call()、apply()、bind()的用法理解
一.bind的用法 第一个:obj.showInfo('arg','arg_18');中传的2个参数通过showInfo方法改变的是obj下中的name和age 第二个:obj.showInfo.bi ...