2023-02-22  阅读(29)
原文作者:键盘林 原文地址:https://blog.csdn.net/qq_37909508/category_8976362.html

代理模式

定义:

为其他对象提供一种代理,以控制对这个对象的访问

代理对象在客户端和目标对象之间起到中介的作用

适用场景:

保护目标对象

增强目标对象

优点:

代理模式能将代理对象与真实被调用的目标对象分离

一定程度上降低了系统的耦合度

保护目标对象

增强目标对象

缺点:

代理模式会造成系统设计中类的数目增加

在客户端和目标对象增加一个代理对象,会造成请求处理速度变慢

增加系统的复杂度

扩展:

静态代理

动态代理

CGlib代理

spring中的扩展:

当Bean有实现接口时,Spring就会用JDK的动态代理

当Bean没有实现接口时,Spring使用CGlib

可以强制使用CGlib

在Spring配置中加入<aop:aspectj-autoproxy proxy-target-class="true" />

相关设计模式:

代理模式和装饰者模式

代理模式和适配器模式

coding:

静态代理:

创建Order类

202302222105452981.png

创建IOrderService接口

202302222105464932.png

创建IOrderDao

202302222105472823.png

创建OrderDaoImpl类实现IOrderDao接口

202302222105482234.png

创建OrderServiceImpl类,实现IOrderService接口

202302222105493985.png

创建OrderServiceStaticProxy来增加IOrderService。

202302222105509026.png

方法的具体增强

202302222105521227.png

创建DynamicDataSource

202302222105534908.png

创建DataSourceContextHolder类

202302222105549889.png

回到DynamicDataSource类

2023022221055605410.png

回到OrderServiceStaticProxy

对于dbTouter是用于分库分表的,也就是常说的路由算法,进入到下面那个设置dataSource。也就是大家常用的分库分表。

2023022221055716911.png

在进行一次修改,将方法具体的分离开来

2023022221055891312.png

2023022221060022413.png

上面的dbTouter只有两个值0、1对应下面的db0和db1数据库

2023022221060199114.png

2023022221060344815.png

创建Test类

2023022221060511816.png

运行:

2023022221060664817.png

当前UML类图

2023022221060768818.png

动态代理

创建OrderServiceDynamicProxy类

2023022221060927919.png

2023022221061046920.png

2023022221061181621.png

编写beforeMethod方法

2023022221061302422.png

编写afterMethod方法

2023022221061467523.png

编写invoke方法

2023022221062266124.png

创建Test类

2023022221062427725.png

2023022221062552826.png

2023022221062635727.png

运行:

2023022221062753928.png

debug来跑一下:

2023022221062861829.png

2023022221062968030.png

2023022221063116031.png

此处是动态代理的核心

2023022221063263932.png

2023022221063408433.png

这里面进行了安全检查

2023022221063546134.png

2023022221063678535.png

进入到getProxyClass0()方法中 ,当有缓存就直接返回

2023022221063808536.png

进入proxyClassCache.get()方法中

2023022221063959637.png

如果上面的if没有返回执行下面的程序:

2023022221064107338.png

返回继续执行,新的对象是通过反射的方式创建的

2023022221064227339.png

2023022221064390440.png

往下继续走:

2023022221064559141.png

2023022221064704242.png

2023022221064851743.png

结果:

2023022221065059144.png

Spring中的应用

ProxyFactoryBean类

2023022221065177845.png

核心方法getObject()方法

2023022221065368146.png

类JdkDynamicAopProxy

2023022221065532047.png

在mybatis中的应用:

MapperProxyFactory类

2023022221065754148.png

2023022221065954949.png


Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。

它的内容包括:

  • 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
  • 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
  • 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
  • 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
  • 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
  • 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
  • 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
  • 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw

目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:

想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询

同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。

阅读全文