From 25fcce6248d85d22b3d10d8a710918bbd76ab838 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=E5=98=89=E9=98=B3?= Date: Tue, 25 Sep 2018 16:57:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=95=E4=BE=8B=E6=A8=A1=E5=BC=8FJDK?= =?UTF-8?q?=E3=80=81Spring=E3=80=81mybatis=E6=BA=90=E7=A0=81=E6=A0=B7?= =?UTF-8?q?=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 39 +++++++++++++++++++ .../singleton/ContainerSingleton.java | 7 ++++ .../creational/singleton/HungrySingleton.java | 2 + .../singleton/ThreadLocalInstance.java | 4 ++ .../singleton/ContainerSingletonTest.java | 4 +- .../LazyDoubleCheckSingletonTest.java | 2 +- .../LazySingletonSynchronizedTest.java | 2 +- .../singleton/LazySingletonTest.java | 2 +- .../StaticInnerClassSingletonTest.java | 2 +- .../singleton/ThreadLocalInstanceTest.java | 4 +- 10 files changed, 60 insertions(+), 8 deletions(-) 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