From f83550f1dd0eb9e8274069016582b5592a6cea95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=E5=98=89=E9=98=B3?= Date: Mon, 2 Mar 2020 10:24:26 +0800 Subject: [PATCH] =?UTF-8?q?=E9=9D=99=E6=80=81=E4=BB=A3=E7=90=86=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pattern/structural/proxy/IOrderDao.java | 13 +++++ .../structural/proxy/IOrderDaoImpl.java | 16 ++++++ .../structural/proxy/IOrderService.java | 18 +++++++ .../structural/proxy/IOrderServiceImpl.java | 28 ++++++++++ .../pattern/structural/proxy/Order.java | 19 +++++++ .../staticproxy/OrderServiceStaticProxy.java | 52 +++++++++++++++++++ .../OrderServiceStaticProxyTest.java | 25 +++++++++ 7 files changed, 171 insertions(+) create mode 100644 src/main/java/top/fjy8018/designpattern/pattern/structural/proxy/IOrderDao.java create mode 100644 src/main/java/top/fjy8018/designpattern/pattern/structural/proxy/IOrderDaoImpl.java create mode 100644 src/main/java/top/fjy8018/designpattern/pattern/structural/proxy/IOrderService.java create mode 100644 src/main/java/top/fjy8018/designpattern/pattern/structural/proxy/IOrderServiceImpl.java create mode 100644 src/main/java/top/fjy8018/designpattern/pattern/structural/proxy/Order.java create mode 100644 src/main/java/top/fjy8018/designpattern/pattern/structural/proxy/staticproxy/OrderServiceStaticProxy.java create mode 100644 src/test/java/top/fjy8018/designpattern/pattern/structural/proxy/staticproxy/OrderServiceStaticProxyTest.java diff --git a/src/main/java/top/fjy8018/designpattern/pattern/structural/proxy/IOrderDao.java b/src/main/java/top/fjy8018/designpattern/pattern/structural/proxy/IOrderDao.java new file mode 100644 index 0000000..0204c24 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/structural/proxy/IOrderDao.java @@ -0,0 +1,13 @@ +package top.fjy8018.designpattern.pattern.structural.proxy; + +/** + * DAO层——与业务无关 + * 仿mybatis + * + * @author F嘉阳 + * @date 2020/2/29 16:15 + */ +public interface IOrderDao { + + int insert(Order order); +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/structural/proxy/IOrderDaoImpl.java b/src/main/java/top/fjy8018/designpattern/pattern/structural/proxy/IOrderDaoImpl.java new file mode 100644 index 0000000..1244052 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/structural/proxy/IOrderDaoImpl.java @@ -0,0 +1,16 @@ +package top.fjy8018.designpattern.pattern.structural.proxy; + +import lombok.extern.slf4j.Slf4j; + +/** + * @author F嘉阳 + * @date 2020/2/29 16:17 + */ +@Slf4j +public class IOrderDaoImpl implements IOrderDao { + @Override + public int insert(Order order) { + log.info("DAO层添加订单记录成功"); + return 1; + } +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/structural/proxy/IOrderService.java b/src/main/java/top/fjy8018/designpattern/pattern/structural/proxy/IOrderService.java new file mode 100644 index 0000000..697b369 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/structural/proxy/IOrderService.java @@ -0,0 +1,18 @@ +package top.fjy8018.designpattern.pattern.structural.proxy; + +/** + * 订单服务层 + * + * @author F嘉阳 + * @date 2020/2/29 16:14 + */ +public interface IOrderService { + + /** + * 保存订单 + * + * @param order + * @return 保存的行数 + */ + int save(Order order); +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/structural/proxy/IOrderServiceImpl.java b/src/main/java/top/fjy8018/designpattern/pattern/structural/proxy/IOrderServiceImpl.java new file mode 100644 index 0000000..9af5b74 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/structural/proxy/IOrderServiceImpl.java @@ -0,0 +1,28 @@ +package top.fjy8018.designpattern.pattern.structural.proxy; + +import lombok.extern.slf4j.Slf4j; + +/** + * @author F嘉阳 + * @date 2020/2/29 16:16 + */ +@Slf4j +public class IOrderServiceImpl implements IOrderService { + + /** + * 模拟Spring注入 + */ + private IOrderDao orderDao = new IOrderDaoImpl(); + + /** + * 保存订单 + * + * @param order + * @return 保存的行数 + */ + @Override + public int save(Order order) { + log.info("Service层调用DAO层添加订单记录成功"); + return orderDao.insert(order); + } +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/structural/proxy/Order.java b/src/main/java/top/fjy8018/designpattern/pattern/structural/proxy/Order.java new file mode 100644 index 0000000..d1399e5 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/structural/proxy/Order.java @@ -0,0 +1,19 @@ +package top.fjy8018.designpattern.pattern.structural.proxy; + +import lombok.Getter; +import lombok.Setter; + +/** + * 订单 + * + * @author F嘉阳 + * @date 2020/2/29 16:12 + */ +@Getter +@Setter +public class Order { + + private Object orderInfo; + + private Integer userId; +} diff --git a/src/main/java/top/fjy8018/designpattern/pattern/structural/proxy/staticproxy/OrderServiceStaticProxy.java b/src/main/java/top/fjy8018/designpattern/pattern/structural/proxy/staticproxy/OrderServiceStaticProxy.java new file mode 100644 index 0000000..beac648 --- /dev/null +++ b/src/main/java/top/fjy8018/designpattern/pattern/structural/proxy/staticproxy/OrderServiceStaticProxy.java @@ -0,0 +1,52 @@ +package top.fjy8018.designpattern.pattern.structural.proxy.staticproxy; + +import lombok.extern.slf4j.Slf4j; +import top.fjy8018.designpattern.pattern.structural.proxy.IOrderService; +import top.fjy8018.designpattern.pattern.structural.proxy.IOrderServiceImpl; +import top.fjy8018.designpattern.pattern.structural.proxy.Order; +import top.fjy8018.designpattern.pattern.structural.proxy.db.DataSourceContextHolder; + +/** + * 静态代理实现分库 + * + * @author F嘉阳 + * @date 2020/2/29 16:20 + */ +@Slf4j +public class OrderServiceStaticProxy { + + /** + * 模拟Spring注入 + */ + private IOrderService orderService = new IOrderServiceImpl(); + + /** + * 对源方法增强 + * + * @param order + * @return + */ + public int save(Order order) { + beforeMethod(); + + // 通过用户ID对2取模分库 + Integer userId = order.getUserId(); + int dbRouter = userId % 2; + log.info("静态代理分配到【db{}】处理数据", dbRouter); + + // 设置DataSource + DataSourceContextHolder.setDBType(String.valueOf(dbRouter)); + + afterMethod(); + + return orderService.save(order); + } + + private void beforeMethod() { + log.info("静态代理before code"); + } + + private void afterMethod() { + log.info("静态代理after code"); + } +} diff --git a/src/test/java/top/fjy8018/designpattern/pattern/structural/proxy/staticproxy/OrderServiceStaticProxyTest.java b/src/test/java/top/fjy8018/designpattern/pattern/structural/proxy/staticproxy/OrderServiceStaticProxyTest.java new file mode 100644 index 0000000..477659b --- /dev/null +++ b/src/test/java/top/fjy8018/designpattern/pattern/structural/proxy/staticproxy/OrderServiceStaticProxyTest.java @@ -0,0 +1,25 @@ +package top.fjy8018.designpattern.pattern.structural.proxy.staticproxy; + +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Test; +import top.fjy8018.designpattern.pattern.structural.proxy.Order; + +/** + * @author F嘉阳 + * @date 2020/2/29 17:17 + */ +@Slf4j +class OrderServiceStaticProxyTest { + + @Test + void save() { + Order order1 = new Order(); + order1.setUserId(1); + Order order2 = new Order(); + order2.setUserId(2); + + OrderServiceStaticProxy proxy = new OrderServiceStaticProxy(); + proxy.save(order1); + proxy.save(order2); + } +} \ No newline at end of file