单例模式初步
来源:互联网 发布:网络改变大脑阅读答案 编辑:程序博客网 时间:2024/06/07 03:59
对于单例模式的创建有多种方式,比较常用的是:
这种写法是当我们第一次调用getNewInstance()方法的时候就会生成new一个对象。或者直接在类的初始化的时候生成new一个唯一对象,这样的好处是第一次调用的时候对象就已经生成了,缺点也很明显,没有调用,对象依然存在。那么spring 中如何应用单例模式生成对象的呢?
在spring中配置的Bean,如果没有明确指定,那么都是以单例模式创建的。spring 如何实现单例的?尤其对于多个bean又是如何管理的呢?网上搜了一下,对于spring单例注入采用单例注册表的方式。查看srping源代码(spring-framework-3.1.2.RELEASE),发现有一个Map结构存储了对应的信息:
/** Cache of singleton objects: bean name --> bean instance */
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>();
其中key是bean名称,key是生成对象。对于spring中的单例创建,可以简单模拟为以下代码:
对于采用map结构,也说明了当两个同样bean被注入的时候,后注入的对象会overriding前面注册的对象。
package com.mm.design;public class SinglePattern {private String name;private static SinglePattern single ;//将构造器私有化private SinglePattern(String name){this.name = name;}//单线程public static SinglePattern getNewInstance(String name){if(single == null){single = new SinglePattern(name);}return single;}//多线程访问public static SinglePattern getNewInstanceInMultThread(String name){if(single == null){synchronized (SinglePattern.class) {if(single==null){single = new SinglePattern(name);}}}return single;}}
这种写法是当我们第一次调用getNewInstance()方法的时候就会生成new一个对象。或者直接在类的初始化的时候生成new一个唯一对象,这样的好处是第一次调用的时候对象就已经生成了,缺点也很明显,没有调用,对象依然存在。那么spring 中如何应用单例模式生成对象的呢?
在spring中配置的Bean,如果没有明确指定,那么都是以单例模式创建的。spring 如何实现单例的?尤其对于多个bean又是如何管理的呢?网上搜了一下,对于spring单例注入采用单例注册表的方式。查看srping源代码(spring-framework-3.1.2.RELEASE),发现有一个Map结构存储了对应的信息:
/** Cache of singleton objects: bean name --> bean instance */
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>();
其中key是bean名称,key是生成对象。对于spring中的单例创建,可以简单模拟为以下代码:
package com.mm.design;import java.util.HashMap;import java.util.Map;public class SinglePatternSpring { //将单例在map中注册private static Map<String ,SinglePatternSpring> map = new HashMap<String,SinglePatternSpring>();static{//将类名和对象实例 作为key和valueSinglePatternSpring single = new SinglePatternSpring();map.put(single.getClass().getName(), single);}private SinglePatternSpring(){}public static SinglePatternSpring getNewInstance(String name){if(name == null){//如果传入默认为空 默认返回对象name = SinglePatternSpring.class.getName();}if(map.get(name) == null){try {map.put(name, (SinglePatternSpring) Class.forName(name).newInstance());} catch (Exception e) {System.out.println("创建单例失败!");}}return map.get(name);}}
对于采用map结构,也说明了当两个同样bean被注入的时候,后注入的对象会overriding前面注册的对象。
- 单例模式初步
- 单例模式初步
- iOS单例初步理解
- 黑马程序员_JavaSE基础知识总结七:new、this、static关键字和单例模式初步
- java学习初探5之static关键字和单例模式初步
- Agile Lite框架初步认识之单页模式
- 单例(singleton)的初步认识
- 单例、单例模式
- 单例模式-多线程单例模式
- 单件模式(单例模式)
- 设计模式------单例模式
- 设计模式------单例模式
- 设计模式-单例模式
- 设计模式 - 单例模式
- 设计模式---单例模式
- 设计模式---单例模式
- PHP模式-单例模式
- 【设计模式】单例模式
- MyEclipse设置Annotation自动提示
- Composite模式
- sqlserver 2005 重新生成 master 数据库
- Struts、Spring、hibernate的整合
- 用“万能数据库查询分析器”测试SQLite对4大SQL精髓语句的支持
- 单例模式初步
- Java中获取键盘输入值的三种方法
- Java编程中“为了性能”需做的26件事
- xzxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
- Hibernate基础之五:自增主键@GeneratedValue、@SequenceGenerator
- 【C语言学】写一个俩个数交换的宏定义
- 用javascript编写优美的代码
- 测试用
- 安装CGAL总结