【学习打卡】第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个小时,重新学习一下设计模式 更加清楚知道代理模式的应用以及如何在自己项目当中去使用它 大家一起加油 💪🏻
共同学习,写下你的评论
评论加载中...
作者其他优质文章