diff --git a/pom.xml b/pom.xml
index 9cb920c..e68f9b7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -14,6 +14,7 @@
UTF-8
1.7
1.7
+ 5.1.0.RELEASE
@@ -53,6 +54,44 @@
3.8.1
+
+
+ org.mybatis
+ mybatis
+ 3.4.6
+
+
+
+
+ org.mybatis
+ mybatis-spring
+ 1.3.2
+
+
+
+ org.springframework
+ spring-webmvc
+ ${org.springframework.version}
+
+
+
+ org.springframework
+ spring-oxm
+ ${org.springframework.version}
+
+
+
+ org.springframework
+ spring-jdbc
+ ${org.springframework.version}
+
+
+
+ org.springframework
+ spring-tx
+ ${org.springframework.version}
+
+
diff --git a/src/main/java/top/fjy8018/designpattern/pattern/creational/singleton/ContainerSingleton.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/singleton/ContainerSingleton.java
index 8ea79ae..6a16aec 100644
--- a/src/main/java/top/fjy8018/designpattern/pattern/creational/singleton/ContainerSingleton.java
+++ b/src/main/java/top/fjy8018/designpattern/pattern/creational/singleton/ContainerSingleton.java
@@ -2,7 +2,9 @@ package top.fjy8018.designpattern.pattern.creational.singleton;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.config.AbstractFactoryBean;
+import java.awt.*;
import java.util.HashMap;
import java.util.Map;
@@ -10,6 +12,11 @@ import java.util.Map;
* 基于容器(集合)实现单例
* 适用于类加载时有多个对象需要实例化场景
*
+ * JDK源码样例:{@link Desktop#getDesktop()}
+ * 其{@link sun.awt.AppContext} 通过{@link HashMap}实现,使用同步保证单例线程安全
+ * Spring 源码样例:{@link AbstractFactoryBean#getObject()} 在156行判断当前类是否已经实例化
+ * 若没有实例化则在{@link AbstractFactoryBean#getEarlySingletonInstance()}中通过代理方式实例化对象
+ *
* @author F嘉阳
* @date 2018-09-24 22:31
*/
diff --git a/src/main/java/top/fjy8018/designpattern/pattern/creational/singleton/HungrySingleton.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/singleton/HungrySingleton.java
index 4cf6d76..67aec8b 100644
--- a/src/main/java/top/fjy8018/designpattern/pattern/creational/singleton/HungrySingleton.java
+++ b/src/main/java/top/fjy8018/designpattern/pattern/creational/singleton/HungrySingleton.java
@@ -9,6 +9,8 @@ import java.io.Serializable;
* 优点:写法简单,类加载时初始化,线程安全
* 缺点:若类不被使用则会造成内存浪费
*
+ * JDK源码样例:{@link Runtime} 其实例在类加载时实例化并通过{@link Runtime#getRuntime()} 获取
+ *
* @author F嘉阳
* @date 2018-09-24 15:38
*/
diff --git a/src/main/java/top/fjy8018/designpattern/pattern/creational/singleton/ThreadLocalInstance.java b/src/main/java/top/fjy8018/designpattern/pattern/creational/singleton/ThreadLocalInstance.java
index df45d21..8eb7eaa 100644
--- a/src/main/java/top/fjy8018/designpattern/pattern/creational/singleton/ThreadLocalInstance.java
+++ b/src/main/java/top/fjy8018/designpattern/pattern/creational/singleton/ThreadLocalInstance.java
@@ -1,8 +1,12 @@
package top.fjy8018.designpattern.pattern.creational.singleton;
+import org.apache.ibatis.executor.ErrorContext;
+
/**
* 基于{@link ThreadLocalInstance} 的(伪)单例模式,只能保证线程内单例唯一(空间换时间思想)
*
+ * mybatis源码样例:{@link ErrorContext#instance()} 返回通过ThreadLocal实现的单例对象LOCAL
+ *
* @author F嘉阳
* @date 2018-09-25 16:24
*/
diff --git a/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/ContainerSingletonTest.java b/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/ContainerSingletonTest.java
index 10de4f1..a7b7125 100644
--- a/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/ContainerSingletonTest.java
+++ b/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/ContainerSingletonTest.java
@@ -57,7 +57,7 @@ class ContainerSingletonTest {
e.printStackTrace();
}
Object singleton = ContainerSingleton.getInstance("object");
- log.info(Thread.currentThread().getName() + " " + singleton);
+ log.info(" " + singleton);
}
}
@@ -73,7 +73,7 @@ class ContainerSingletonTest {
}
Object singleton = ContainerSingletonHashtable.getInstance("object");
- log.info(Thread.currentThread().getName() + " " + singleton);
+ log.info(" " + singleton);
}
}
}
\ No newline at end of file
diff --git a/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/LazyDoubleCheckSingletonTest.java b/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/LazyDoubleCheckSingletonTest.java
index 76db35e..0f078c0 100644
--- a/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/LazyDoubleCheckSingletonTest.java
+++ b/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/LazyDoubleCheckSingletonTest.java
@@ -34,7 +34,7 @@ class LazyDoubleCheckSingletonTest {
} catch (InterruptedException e) {
e.printStackTrace();
}
- log.info(Thread.currentThread().getName() + " " + lazySingleton);
+ log.info(" " + lazySingleton);
}
}
}
\ No newline at end of file
diff --git a/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/LazySingletonSynchronizedTest.java b/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/LazySingletonSynchronizedTest.java
index 9116539..db1a241 100644
--- a/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/LazySingletonSynchronizedTest.java
+++ b/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/LazySingletonSynchronizedTest.java
@@ -34,7 +34,7 @@ class LazySingletonSynchronizedTest {
} catch (InterruptedException e) {
e.printStackTrace();
}
- log.info(Thread.currentThread().getName() + " " + lazySingleton);
+ log.info(" " + lazySingleton);
}
}
}
\ No newline at end of file
diff --git a/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/LazySingletonTest.java b/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/LazySingletonTest.java
index 75e7f99..7d88b71 100644
--- a/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/LazySingletonTest.java
+++ b/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/LazySingletonTest.java
@@ -41,7 +41,7 @@ class LazySingletonTest {
} catch (InterruptedException e) {
e.printStackTrace();
}
- log.info(Thread.currentThread().getName() + " " + lazySingleton);
+ log.info(" " + lazySingleton);
}
}
}
\ No newline at end of file
diff --git a/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/StaticInnerClassSingletonTest.java b/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/StaticInnerClassSingletonTest.java
index bba6ac5..c54be38 100644
--- a/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/StaticInnerClassSingletonTest.java
+++ b/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/StaticInnerClassSingletonTest.java
@@ -29,7 +29,7 @@ class StaticInnerClassSingletonTest {
} catch (Exception e) {
e.printStackTrace();
}
- log.info(Thread.currentThread().getName() + " " + lazySingleton);
+ log.info(" " + lazySingleton);
}
}
}
\ No newline at end of file
diff --git a/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/ThreadLocalInstanceTest.java b/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/ThreadLocalInstanceTest.java
index da6db81..d698997 100644
--- a/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/ThreadLocalInstanceTest.java
+++ b/src/test/java/top/fjy8018/designpattern/pattern/creational/singleton/ThreadLocalInstanceTest.java
@@ -18,7 +18,7 @@ class ThreadLocalInstanceTest {
// 在主线程中取
for (int i = 0; i < 5; i++) {
ThreadLocalInstance instance = ThreadLocalInstance.getInstance();
- log.info(Thread.currentThread().getName() + " " + instance);
+ log.info(" " + instance);
}
Thread thread1 = new Thread(new ThreadLocalInstanceTest.MyRunnable());
@@ -40,7 +40,7 @@ class ThreadLocalInstanceTest {
} catch (Exception e) {
e.printStackTrace();
}
- log.info(Thread.currentThread().getName() + " " + instance);
+ log.info(" " + instance);
}
}
}
\ No newline at end of file