摘要/设计模式/代理模式 Proxy Pattern

what

给对象增加一个代理者 通过控制代理者可以实现控制代理的对象

减小耦合度 增加复杂度 增加处理时间

结构型设计模式

why

有很多种原因 比较常见的是

 

保护目标对象

增强目标对象

 

需要远程代理比如RPC所用的就是远程的动态代理

或者创建被代理的对象开销很大,通过反射减少开销

或者需要保护实际工作的对象的逻辑,进行安全控制,进行防火墙代理

也会让被代理的对象更加专注于自己的业务,职责清晰

how

静态代理

业务类和代理类都实现相同的接口

连接池 静态代理连接空闲时间 动态代理 防止对连接的操作

代理类中包含代理的对象实例 实现接口的方法

代理类新增方法需要手动同步

动态代理

用invocationHandler接口 抽象出相同逻辑 用反射调用方法

代理类新增方法可结合策略模式新增策略

SpringAOP

AOP(Aspect-Oriented Programming)面向切面编程

Spring通过java的反射机制生产被代理接口的新的匿名实现类 重写AOP增强方法

通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能

Spring 利用动态代理实现 AOP 有两个非常重要的类,一个是 JdkDynamicAopProxy 类 和 CglibAopProxy 类

Spring 中的代理选择原则

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

2、当 Bean 没有实现接口时,Spring 选择 CGLib。 3、Spring 可以通过配置强制使用 CGLib,只需在 Spring 的配置文件中加入如下代码:

<aop:aspectj-autoproxy proxy-target-class="true"

 

JDK动态代理 字节码重组

实现InvocationHandlet接口创建自己的调用处理器 重写invoke方法->通过为Proxy类指定ClassLoader和一组interfaces创建动态代理->通过反射机制获取动态代理类的构造函数 其唯一参数类型就是调用处理器接口类型->通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数参入->JVM会编译新生成的字节码文件再重新加载到JVM中运行 通过接口定义业务方法

cglib动态代理

执行代理方法效率比JDK高,FastClass机制,用底层的字节码技术,字节码为类创建子类->子类中用方法拦截来拦截所有父类方法的调用->织入横切逻辑,简单来说,实现是通过为代理类和被代理类都生成一个Class,分配一个index,作为入参直接定位到要调用的方法直接调用,省去反射调用

因为是针对类实现代理,对指定的类生成一个子类,覆盖其中的方法,因为是集成,所以类的方法最好不要声明成final

 

切面(Aspect) 共有功能的实现

通知(Advice) 切面的具体实现

连接点(Joinpoint) 程序在运行过程中能够插入切面的点

切入点(Pointcut) 定义通知应该切入到哪些连接点上

目标对象(Target) 被通知的对象 即将切入切面的对象

代理对象(Proxy) 将通知应用到目标对象后被动态创建的对象

织入(Weaving) 将切面应用到目标对象从而创建一个新的代理对象的过程

对数据库进行分库分表

数据库分成多个实例->一个库中的表分到不同的数据库中->数据库分片 一个库中的相关表进行水平拆分到不同实例的数据库

应用层分片    完成分片逻辑

代理层分片    应用层和底层数据库中间添加一层代理层 分片的路由规则由代理层处理

MyCAT server.xml系统参数/用户参数 schema.xml逻辑库表与分片 rule.xml逻辑库表分片规则 分库分表 读写分离 主备切换

ThreadLocal

进行数据源动态切换(拆库) 

动态数据源(Dynamic DataSource)

指定package决定使用哪个数据源 使用的是Spring Aop实现

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值