代理模式
定义:
为其他对象提供一种代理,以控制对这个对象的访问
代理对象在客户端和目标对象之间起到中介的作用
适用场景:
保护目标对象
增强目标对象
优点:
代理模式能将代理对象与真实被调用的目标对象分离
一定程度上降低了系统的耦合度
保护目标对象
增强目标对象
缺点:
代理模式会造成系统设计中类的数目增加
在客户端和目标对象增加一个代理对象,会造成请求处理速度变慢
增加系统的复杂度
扩展:
静态代理
动态代理
CGlib代理
spring中的扩展:
当Bean有实现接口时,Spring就会用JDK的动态代理
当Bean没有实现接口时,Spring使用CGlib
可以强制使用CGlib
在Spring配置中加入<aop:aspectj-autoproxy proxy-target-class="true" />
相关设计模式:
代理模式和装饰者模式
代理模式和适配器模式
coding:
静态代理:
创建Order类
创建IOrderService接口
创建IOrderDao
创建OrderDaoImpl类实现IOrderDao接口
创建OrderServiceImpl类,实现IOrderService接口
创建OrderServiceStaticProxy来增加IOrderService。
方法的具体增强
创建DynamicDataSource
创建DataSourceContextHolder类
回到DynamicDataSource类
回到OrderServiceStaticProxy
对于dbTouter是用于分库分表的,也就是常说的路由算法,进入到下面那个设置dataSource。也就是大家常用的分库分表。
在进行一次修改,将方法具体的分离开来
上面的dbTouter只有两个值0、1对应下面的db0和db1数据库
创建Test类
运行:
当前UML类图
动态代理
创建OrderServiceDynamicProxy类
编写beforeMethod方法
编写afterMethod方法
编写invoke方法
创建Test类
运行:
debug来跑一下:
此处是动态代理的核心
这里面进行了安全检查
进入到getProxyClass0()方法中 ,当有缓存就直接返回
进入proxyClassCache.get()方法中
如果上面的if没有返回执行下面的程序:
返回继续执行,新的对象是通过反射的方式创建的
往下继续走:
结果:
Spring中的应用
ProxyFactoryBean类
核心方法getObject()方法
类JdkDynamicAopProxy
在mybatis中的应用:
MapperProxyFactory类
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] ,回复【面试题】 即可免费领取。