博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring开发_spring中Bean的作用域_singleton_prototype
阅读量:6844 次
发布时间:2019-06-26

本文共 5206 字,大约阅读时间需要 17 分钟。

项目结构:

这里需要设置环境:

添加如下jar包

commons-logging.jar

spring.jar

/spring_0003_bean的作用域/src/com/b510/bean/dao/PrototypeBeanDao.java

1 package com.b510.bean.dao;  2  3 /**  4  * 原型模式dao  5  *  6  * @author Hongten  7  *  8  */  9 public interface PrototypeBeanDao {
10 11 /** 12 * 原型模式 13 */ 14 public abstract void prototype(); 15 16 }

/spring_0003_bean的作用域/src/com/b510/bean/dao/SingletonBeanDao.java

1 package com.b510.bean.dao;  2  3 /**  4  * 单例模式dao  5  *  6  * @author Hongten  7  *  8  */  9 public interface SingletonBeanDao {
10 11 /** 12 * 单例模式 13 */ 14 public abstract void singleton(); 15 16 }

/spring_0003_bean的作用域/src/com/b510/bean/PrototypeBean.java

1 package com.b510.bean;  2  3 import com.b510.bean.dao.PrototypeBeanDao;  4  5 /**  6  * 原型模式prototype  7  *  8  * @author Hongten  9  * 10  */ 11 public class PrototypeBean implements PrototypeBeanDao {
12 13 /* (non-Javadoc) 14 * @see com.b510.bean.PrototypeBeanDao#prototype() 15 */ 16 public void prototype() {
17 System.out 18 .println("原型模式,每次通过容器的getBean方法获取prototype定义的Bean,都将产生一个新的Bean实例"); 19 } 20 }

/spring_0003_bean的作用域/src/com/b510/bean/SingletonBean.java

1 package com.b510.bean;  2  3 import com.b510.bean.dao.SingletonBeanDao;  4  5 /**  6  * 单例模式singleton  7  *  8  * @author Hongten  9  * 10  */ 11 public class SingletonBean implements SingletonBeanDao {
12 13 /* (non-Javadoc) 14 * @see com.b510.bean.SingletonBeanDao#singleton() 15 */ 16 public void singleton() {
17 System.out.println("单例模式,在整个spring IoC容器中,使用singleton定义Bean将只有一个实例"); 18 } 19 }

/spring_0003_bean的作用域/src/beans.xml

1 
2
6
7
8

/spring_0003_bean的作用域/src/com/b510/test/BeanTest.java

1 package com.b510.test;  2  3 import org.springframework.context.ApplicationContext;  4 import org.springframework.context.support.ClassPathXmlApplicationContext;  5  6 import com.b510.bean.dao.PrototypeBeanDao;  7 import com.b510.bean.dao.SingletonBeanDao;  8 /**  9  * 测试类,在此类中,我们主要是测试singleton(单例模式)和prototype(原型模式) 10  * 如果不指定Bean的作用域,spring会默认指定Bean的作用域为singleton(单例模式),java在创建java实例 11  * 的时候,需要进行内存申请;销毁实例的时候,需要完成垃圾回收,而这些工作都会导致系统开销的增加。 12  * prototype(原型模式)作用域的创建,销毁代价比较大;singleton(单例模式)作用域的Bean实例一次就可以 13  * 重复利用,因此,我们尽量用singleton(单例模式),除非有必要有prototype(原型模式)。 14  * 15  * @author Hongten 16  * 17  */ 18 public class BeanTest {
19 20 /** 21 * @param args 22 */ 23 public static void main(String[] args) {
24 new BeanTest().instanceContext(); 25 } 26 27 public void instanceContext() {
28 ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml"); 29 SingletonBeanDao singletonBeanDao = (SingletonBeanDao) ctx 30 .getBean("single"); 31 singletonBeanDao.singleton(); 32 SingletonBeanDao singletonBeanDao1 = (SingletonBeanDao) ctx 33 .getBean("single"); 34 singletonBeanDao1.singleton(); 35 System.out.print("singletonBeanDao与singletonBeanDao1是否是同一个:"); 36 System.out.println(singletonBeanDao1==singletonBeanDao); 37 PrototypeBeanDao prototypeBeanDao = (PrototypeBeanDao) ctx 38 .getBean("proto"); 39 prototypeBeanDao.prototype(); 40 PrototypeBeanDao prototypeBeanDao1 = (PrototypeBeanDao) ctx 41 .getBean("proto"); 42 prototypeBeanDao1.prototype(); 43 System.out.print("prototypeBeanDao与prototypeBeanDao1是否是同一个:"); 44 System.out.println(prototypeBeanDao==prototypeBeanDao1); 45 46 } 47 48 }

运行效果:

1 2012-3-6 18:19:34 org.springframework.context.support.AbstractApplicationContext prepareRefresh  2 信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@c1b531: display name [org.springframework.context.support.ClassPathXmlApplicationContext@c1b531]; startup date [Tue Mar 06 18:19:34 CST 2012]; root of context hierarchy  3 2012-3-6 18:19:34 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions  4 信息: Loading XML bean definitions from class path resource [beans.xml]  5 2012-3-6 18:19:34 org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory  6 信息: Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext@c1b531]: org.springframework.beans.factory.support.DefaultListableBeanFactory@1507fb2  7 2012-3-6 18:19:34 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons  8 信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1507fb2: defining beans [single,proto]; root of factory hierarchy  9 单例模式,在整个spring IoC容器中,使用singleton定义Bean将只有一个实例 10 单例模式,在整个spring IoC容器中,使用singleton定义Bean将只有一个实例 11 singletonBeanDao与singletonBeanDao1是否是同一个:true 12 原型模式,每次通过容器的getBean方法获取prototype定义的Bean,都将产生一个新的Bean实例 13 原型模式,每次通过容器的getBean方法获取prototype定义的Bean,都将产生一个新的Bean实例 14 prototypeBeanDao与prototypeBeanDao1是否是同一个:false

我们看到:

使用singleton的时候,singletonBeanDao与singletonBeanDao1是同一个对象;而使用prototype的时候,prototypeBeanDao与prototypeBeanDao1不是同一个对象;他是

在系统调用的时候,才new出来的。而singleton是一次创建,多次使用。

 

 

 

 

转载地址:http://rsdul.baihongyu.com/

你可能感兴趣的文章
WCF后续之旅(15): 逻辑地址和物理地址
查看>>
云计算变革十字路口 CIO转型的历史机遇
查看>>
memcached的分布式算法-Consistent Hashing
查看>>
韩忠恒:解读Power System智慧运算基础
查看>>
来自Reddit的声音:网络人员对SDN说“不”
查看>>
贵阳“小步快跑”搭上云计算的早班车
查看>>
配置少量固态硬盘即能大幅提升性能
查看>>
国内车载信息安全市场 东软靠技术创新的行动力独树一帜
查看>>
中国银行携手IBM成功建成智能化网点
查看>>
再谈大型数据中心的运维工作
查看>>
报告显示电话监控技术处于发展浪潮
查看>>
安全研究人员发现可以利用推特控制僵尸网络
查看>>
三种在Linux上创建或扩展交换分区的简单方法
查看>>
LMD Tool:Linux恶意软件检测工具
查看>>
铜缆宽带接入即将走向末路?
查看>>
哪些技术对5G贡献最大?毫米波成工程师追捧之一
查看>>
企业级SaaS服务的现实之路:放弃团队 直指公司
查看>>
你应该成为 Web 开发者的 5 大理由
查看>>
Locky勒索软件是如何利用DGA的?
查看>>
打造自己的 Python 编码环境
查看>>