【学习打卡】第7天 Java设计模式精讲-Debug方式+内存分析 第十六讲
课程名称:Java设计模式精讲-Debug方式+内存分析,真正学懂设计模式
课程章节: 代理模式+Coding+源码解析
主讲老师:Geely
课程内容:
今天学习的内容包括:
什么是代理模式 代理模式 优点 缺点 Coding 源码解析 以及在业务上的应用
课程收获:
代理模式
代理 定义与类型
1.定义
为其他对象提供一种代理,以控制对这个对象的访问
1.1 特点
代理对象在客户端和目标对象之间起到中介的作用
1.2 类型 : 结构型
2.适用场景
1、保护目标对象
2、增强目标对象
3.缺点
1.代理模式会造成系统设计中类的数目增加
2.在客户端和目标对象增加一个代理对象,会造成请求处理速度变慢
3.增加系统的复杂度
4.优点
1.代理模式能将代理对象与真实被调用的目标对象分离
2.一定程度上降低了系统的耦合度,扩展性好
3.保护目标对象
4.增强目标对象
5.代理-扩展
静态代理
动态代理
CGLib 代理 继承 finaly 修饰符
6.Spring 代理选择-扩展
当Bean 有实现接口时 ,Spring 就会用JDK 的动态代理
当Bean 没有实现接口时 Spring使用CGlib
6.uml 设计图
8.代码如下
package com.zw.design.pattern.creational.structural.proxy;
import lombok.Data;
@Data
public class Order {
private Object orderInfo;
private Long userId;
}
package com.zw.design.pattern.creational.structural.proxy;
public interface IOrderDao {
int insert (Order order);
}
package com.zw.design.pattern.creational.structural.proxy;
public class IOrderDaoImpl implements IOrderDao {
@Override
public int insert(Order order) {
System.out.println("DAO 层添加order 成功");
return 1;
}
}
package com.zw.design.pattern.creational.structural.proxy;
public interface IOrderService {
int saveOrder(Order order);
}
package com.zw.design.pattern.creational.structural.proxy;
public class IOrderServiceImpl implements IOrderService{
private IOrderDao IOrderDao;
@Override
public int saveOrder(Order order) {
IOrderDao=new IOrderDaoImpl();
System.out.println("order = service层调用dao层 " + order);
return IOrderDao.insert(order);
}
}//spring分库思想
package com.zw.design.pattern.creational.structural.proxy.db;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DataSourceContextHolder.getDbType();
}
}
package com.zw.design.pattern.creational.structural.proxy.db;
public class DataSourceContextHolder {
private static final ThreadLocal<String> CONTEXT_HOLDER=new ThreadLocal<String>();
public static void setDbType(String dbType){
CONTEXT_HOLDER.set(dbType);
}
public static String getDbType(){
return CONTEXT_HOLDER.get();
}
public static void clearDBType(){
CONTEXT_HOLDER.remove();
}
}静态代理类
package com.zw.design.pattern.creational.structural.proxy.staticproxy;
import com.zw.design.pattern.creational.structural.proxy.IOrderService;
import com.zw.design.pattern.creational.structural.proxy.IOrderServiceImpl;
import com.zw.design.pattern.creational.structural.proxy.Order;
import com.zw.design.pattern.creational.structural.proxy.db.DataSourceContextHolder;
/****
* 静态代理
*/
public class OrderServiceStaticProxy {
private IOrderService iOrderService;
public int saveOrder(Order order){
beforeMethod();
iOrderService=new IOrderServiceImpl();
Long userId=order.getUserId();
//开始业务操作
int dbRouter= (int) (userId%2);
System.out.println("dbRouter = 静态代理分配到 db" + dbRouter +"处理数据");
//TODO 设置dataSource 这里有spring 分库的思想 ;
DataSourceContextHolder.setDbType(String.valueOf(dbRouter));
afterMethod();
return iOrderService.saveOrder(order);
}
private void beforeMethod(){
System.out.println("静态代理 before code");
}
private void afterMethod(){
System.out.println("静态代理 after code ");
}
}3.测试类
package com.zw.design.pattern.creational.structural.proxy.staticproxy;
import com.zw.design.pattern.creational.structural.proxy.Order;
public class Test {
public static void main(String[] args) {
Order order=new Order();
order.setUserId(2L);
OrderServiceStaticProxy cs=new OrderServiceStaticProxy();
int i = cs.saveOrder(order);
}
}测试结果如下
代理模式在spring框架当中的应用ProxyFactoryBean
还有JdkDynamicAopProxy CglibAopProxy
mybatis 当中的代理类 比如MapperProxyFactory 如图所示 使用了jdk 原生动态代理
今天学习课程共用了2个小时,重新学习一下设计模式 更加清楚知道代理模式的应用以及如何在自己项目当中去使用它 大家一起加油 💪🏻