博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring的单例模式源码小窥
阅读量:4111 次
发布时间:2019-05-25

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

写在前面:趁着寒假尾声整理了一波上学期自己的Java源码笔记总结,把一篇篇小笔记总结成文章,系统性的转到博客,这样的年度总结希望能对同好们有帮助

1.单例模式理解

确保某一个类只有一个实例,而且提供全局访问点实例化并向整个系统提供这个实例,这个类称为单例类(Spring提供的访问点是beanFactory)

2.单例模式的要点有三个

一是某个类只能有一个实例;

二是它必须自行创建这个实例;
三是它必须自行向整个系统提供这个实例。

3.ErrorContext的单例实现代码:

//具有一个static的局部instance变量和一个获取instance变量的方法public class ErrorContext {
//有趣的地方是,LOCAL的静态实例变量使用了ThreadLocal修饰,也就是说它属于每个线程各自的数据 private static final ThreadLocal
LOCAL = new ThreadLocal
();//构造函数是private修饰 private ErrorContext() {
}//而在instance()方法中,先获取本线程的该实例,如果没有就创建该线程独有的ErrorContext public static ErrorContext instance() {
ErrorContext context = LOCAL.get(); if (context == null) {
context = new ErrorContext(); LOCAL.set(context); } return context; }

2.getSingleton一路跟踪下去,发现实际上是调用了 AbstractAutowireCapableBeanFactory 的 doCreateBean 方法,返回了BeanWrapper包装并创建的bean实例。

protected Object getSingleton(String beanName, boolean allowEarlyReference) {
//从缓存singletonObjects(实际上是一个map)中获取bean实例 Object singletonObject = this.singletonObjects.get(beanName); //如果为null,对缓存singletonObjects加锁,然后再从缓存中获取bean,如果继续为null,就创建一个bean。 if (singletonObject == null && this.isSingletonCurrentlyInCreation(beanName)) {
Map var4 = this.singletonObjects; //双重判断加锁 synchronized(this.singletonObjects) {
singletonObject = this.earlySingletonObjects.get(beanName); if (singletonObject == null && allowEarlyReference) {
ObjectFactory
singletonFactory = (ObjectFactory)this.singletonFactories.get(beanName); if (singletonFactory != null) {
//通过 singletonFactory.getObject() 返回具体beanName对应的ObjectFactory来创建bean。 singletonObject = singletonFactory.getObject(); this.earlySingletonObjects.put(beanName, singletonObject); this.singletonFactories.remove(beanName); } } } }

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

你可能感兴趣的文章
月亮私房菜——秘制辣椒油!让你辣得够味!辣得过瘾!
查看>>
内存读写错误??这样搞定它!
查看>>
饺子的10种包法
查看>>
下月起苏州实施扩大儿童免疫规划
查看>>
市民常用电话名录
查看>>
妙!二十九招驱蚊止痒不再愁
查看>>
prerequisite could not be found for bootstrapping 问题解决
查看>>
中国地质调查局:汶川地震原因已有初步的结论
查看>>
制作VSTO 2005 SE开发的Office 2007 AddIn的安装包
查看>>
哀悼四川汶川大地震死难同胞,网站整体变灰色的方法
查看>>
OpenXML 操作例子
查看>>
如何操作 Office Open XML 格式文档
查看>>
Walkthrough: Word 2007 XML 格式
查看>>
宝宝粥谱
查看>>
0到3岁宝宝 59条喂养建议
查看>>
十个习惯让你精通新的开发技术
查看>>
李开复:21世纪最需要的7种人才
查看>>
总结必须学习的10项.NET技术
查看>>
宝宝正常体温及发热处理
查看>>
c#.net常用函数列表
查看>>