学习路径:https://coding.imooc.com/learn/list/270.html
- 应用场景
增强被代理对象的实现,具体增强的途径- 增加前置方法:如过滤期望外的参数、选择数据库连接池、获取持久化的对象等。
- 增加后置方法:将被代理类的返回值封装、对返回值进行筛选等
- 实现
public class OrderServiceStaticProxy {
// 代理类持有被代理对象的引用,该对象是业务逻辑实现类
private IOrderService iOrderService;
public int saveOrder(Order order){
beforeMethod(order);
// 模拟spring注入一个系统服务
iOrderService = new OrderServiceImpl();
// 系统服务处理具体业务
int result = iOrderService.saveOrder(order);
afterMethod();
return result;
}
/**
* 根据不同的id选取不同的数据库连接
* @param order
*/
private void beforeMethod(Order order) {
System.out.println("静态代理before code");
// 模拟不同db的路由
int userId = order.getUserId();
int dbRouter = userId % 2;
System.out.println("静态代理分配到【db" + dbRouter +"】处理数据");
// todo 设置dataSource;
DataSourceContextHolder.setDBType("db" + String.valueOf(dbRouter));
}
private void afterMethod() {
System.out.println("静态代理 after code");
}
}
```java
/**
* 根据不同的id选取不同的数据库连接
* @param order
*/
private void beforeMethod(Order order) {
System.out.println("静态代理before code");
// 模拟不同db的路由
int userId = order.getUserId();
int dbRouter = userId % 2;
System.out.println("静态代理分配到【db" + dbRouter +"】处理数据");
// todo 设置dataSource;
DataSourceContextHolder.setDBType("db" + String.valueOf(dbRouter));
}
public static void main(String[] args) {
// 参数
Order order = new Order();
order.setUserId(1);
// 创建代理, 不直接使用被代理对象
OrderServiceStaticProxy orderServiceStaticProxy = new OrderServiceStaticProxy();
// 使用代理的保存订单号操作
orderServiceStaticProxy.saveOrder(order);
}
- 总结
代理模式的静态代理实现,实质就是对被代理对象的入参和出参进行了一次封装,同时不破坏被代理对象的代码。应用层只用改一行代码即可。