Spring 中的scope prototype与simpleton的区别
首先在applicationContext.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"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
<bean id="scopeSample" class="Spring.t02.ScopeSample" init-method="doInit"
scope="prototype">
<!--
<bean id="scopeSample" class="Spring.t02.ScopeSample" init-method="doInit"
scope="simpleton(或者什么都不写,默认就是simpleton)">
-->
<constructor-arg value="first.."></constructor-arg>
<constructor-arg value="second.."></constructor-arg>
</bean>
<bean id="scopeSample2" class="Spring.t02.ScopeSample2" init-method="doInit">
<property name="name" value="xuhui"></property>
</bean>
</beans>
在ScopeSample.java中:
package Spring.t02;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ScopeSample {
private String first;
private String second;
public String getFirst() {
return first;
}
public void setFirst(String first) {
this.first = first;
}
public String getSecond() {
return second;
}
public void setSecond(String second) {
this.second = second;
}
public ScopeSample(String first, String second) {
System.out.println(" two arguments constructor.....");
this.first = first;
this.second = second;
}
public ScopeSample() {
System.out.println(" no argument constructor.....");
}
public ScopeSample(String first) {
this.first = first;
System.out.println(" one argument constructor.....");
}
public void doInit(){
System.out.println("init .....");
}
public void doDestroy(){
System.out.println(" destroy.....");
}
public static void main(String[]args){
ApplicationContext ac=new
ClassPathXmlApplicationContext("applicationContext.xml");
ScopeSample s1=(ScopeSample)ac.getBean("scopeSample");
ScopeSample s2=(ScopeSample)ac.getBean("scopeSample");//当sope为prototype的时候会调用两次构造方法,
System.out.println("s1==s2?"+(s1==s2));
}
}
在ScopeSample2.java当中:
package Spring.t02;
public class ScopeSample2 {
private String name="";
public void setName(String name) {
this.name = name;
}
public ScopeSample2(String name) {
super();
this.name = name;
System.out.println(" ScopeSample2 one arg construtctor .... ");
}
public ScopeSample2() {
super();
System.out.println(" ScopeSample2 no arg construtctor .... ");
// TODO Auto-generated constructor stub
}
public void doInit(){
System.out.println(this.getClass()+" init....");
}
}
当 scope类型是simpleton的时候:
运行ScopeSample.java输出结果:
two arguments constructor.....
init .....
ScopeSample2 no arg construtctor ....
class Spring.t02.ScopeSample2 init....
s1==s2?true
当scope类型为prototype类型的时候,运行结果是:
ScopeSample2 no arg construtctor ....
class Spring.t02.ScopeSample2 init....
two arguments constructor.....
init .....
two arguments constructor.....
init .....
s1==s2?false
这两次运行结果比较可以总结:
当scope是simpleton的时候, 那么Spring
IOC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。换言之,当把一个bean定义设置为singleton作用域时,Spring
IOC容器只会创建该bean定义的唯一实例。
所以虽然在ScopeSmaple.java中调用了两次getBean但只调用了一次构造方法和init方法
当scope是prototype 的时候,每一次请求获得Bean的时候(即调用geiBean方法的时候)就创建一次对象(即调用构造方法),并调用init方法。
两者的区别还有一点:
我们看到上面两个例子的输出顺序也不一样,注意在加载applicationContext.xml 文件的时候
scope=simpleton(默认情况下)的时候不用请求获得bean就会调用构造方法创建对象,
但是scope=prototype的时候请求获得bean的时候才会去创建对象
本文转载:
http://hi.baidu.com/zhuyuli521/blog/item/fb61990e31c310206059f311.html
分享到:
相关推荐
莱恩·辛普尔顿一个Leiningen插件,用于从本地目录提供文件-与python -m SimpleHTTPServer 非常相似。用法全系统安装将[lein-simpleton "1.3.0"]放入您的:user配置文件的:plugins矢量中,或者如果您在Leiningen 1.x...
XML 数据库的选择在 Simpleton CMS 中体现了轻量级和灵活性的设计理念。XML 是一种自描述的标记语言,可以结构化地存储数据,便于内容的组织和检索。对于开发者来说,XML 数据库的使用使得数据处理更加直观,同时也...
在“Simpleton-Engine-master”这个压缩包中,很可能包含了Simpleton-Engine的源代码、示例项目、文档以及可能的构建脚本。通过研究这些内容,开发者可以深入了解库的工作原理,并根据自己的需求进行定制和扩展。 ...
"Simpleton Adventure Engine" 是一个开源项目,专为游戏开发者设计,它集成了地图编辑器、游戏引擎和跨平台支持。这个工具旨在简化2D冒险游戏的开发过程,特别是那些基于图块的地图设计。让我们深入了解一下这个...
傻瓜
#AngularJS 测试快速入门 这是来自 One Hungry Mind 的 AngularJS 测试快速入门的配套项目。 要下载指南,请访问 。 要运行此项目,请确保已安装 Node。 然后运行npm install和karma start运行测试。
在实际应用中,理解这些词汇的细微差别是很重要的,以避免在交流中造成误解或冒犯。尤其在IT行业,我们经常需要编写邮件、报告或参与国际合作项目,正确的词汇选择可以体现专业素养和尊重他人。 同时,如果你正在...
6. 角色扮演与情境模拟:PPT中可能包括让学生扮演故事中的角色,如老部长和宫廷官员,通过模拟对话,学生可以更深入地理解故事并练习口语。 7. 社会心理分析:故事中的老部长和宫廷官员虽然看不见布料,但为了保持...
对于Simpleton缓存模拟,用户必须以块或地址的形式输入查询序列。 查询序列必须仅由内存大小范围内的整数组成。 对于顺序缓存仿真,要求用户输入至少一项任务。 每个任务都有一个要顺序访问的块/字的相应范围,以及...