静态代理实现

This commit is contained in:
2020-03-02 10:24:26 +08:00
parent e2af80fe2a
commit f83550f1dd
7 changed files with 171 additions and 0 deletions

View File

@@ -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);
}

View File

@@ -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;
}
}

View File

@@ -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);
}

View File

@@ -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);
}
}

View File

@@ -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;
}

View File

@@ -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");
}
}

View File

@@ -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);
}
}