- 代理模式
- 静态代理
- 某个对象提供一个代理,代理角色固定,以控制对这个对象的访问。 代理类和委托类有共同的父类或父接口,这样在任何使用委托类对象的地方都可以用代理对象替代。代理类负责请求的预处理、过滤、将请求分派给委托类处理、以及委托类执行完请求后的后续处理。
- 代理三要素
- 有共同的行为(接口)
- 有目标角色(实现行为)
- 有代理角色(增强目标对象行为)
- 特点
- 目标角色固定
- 在应用程序执行前就得到目标角色
- 代理对象会增强目标对象的行为
- 有可能存在多个代理 引起"类爆炸"(缺点)
- 动态代理
- Jdk动态代理
- 实现InvocationHandler接口
- Java动态代理类中的invoke是怎么调用的?
- Jdk动态代理
- 静态代理
答:在生成的动态代理类$Proxy0.class中,构造方法调用了父类Proxy.class的构造方法,给成员变invocationHandler赋值,$Proxy0.class的static模块中创建了被代理类的方法,调用相应方法时方法体中调用了父类中的成员变量InvocationHandler的invoke()方法。
-
-
- JDK的动态代理依靠接口实现,如果有些类并没有接口实现,则不能使用JDK代理。
- Cglib动态代理
- JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能使用JDK的动态代理,cglib是针对类来实现代理的,它的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。
- JDK代理与CGLIB代理的区别
- JDK动态代理实现接口,Cglib动态代理继承思想
- JDK动态代理(目标对象存在接口时)执行效率高于Ciglib
- 如果目标对象有接口实现,选择JDK代理,如果没有接口实现选择Cglib代理
- Aop
- Aspect Oriented Programing 面向切面编程
- AOP能做什么?
- AOP主要应用于日志记录,性能统计,安全控制,事务处理等方面,实现公共功能性的重复使用
- AOP的特点
- 降低模块与模块之间的耦合度,提高业务代码的聚合度。(高内聚低耦合)
- 提高了代码的复用性。
- 提高系统的扩展性。(高版本兼容低版本)
- 可以在不影响原有的功能基础上添加新的功能
- AOP的底层实现
- 动态代理(JDK + CGLIB)
- AOP基本概念
- Joinpoint(连接点)
- 被拦截到的每个点,spring中指被拦截到的每一个方法,spring aop一个连接点即代表一个方法的执行。
- Pointcut(切入点)
- 对连接点进行拦截的定义(匹配规则定义 规定拦截哪些方法,对哪些方法进行处理),spring 有专门的表达式语言定义。
- Advice(通知)
- 拦截到每一个连接点即(每一个方法)后所要做的操作
- Aspect(切面)
- 切入点与通知的结合,决定了切面的定义,切入点定义了要拦截哪些类的哪些方法,通知则定义了拦截过方法后要做什么,切面则是横切关注点的抽象,与类相似,类是对物体特征的抽象,切面则是横切关注点抽象。
- Target(目标对象)
- 被代理的目标对象
- Weave(织入)
- 将切面应用到目标对象并生成代理对象的这个过程即为织入
- Introduction(引入)
- 在不修改原有应用程序代码的情况下,在程序运行期为类动态添加方法或者字段的过程称为引入
- Joinpoint(连接点)
- 通知
- 前置通知 (前置增强)— before() 执行方法前通知
- 返回通知(返回增强)— afterReturn 方法正常结束返回后的通知
- 异常抛出通知(异常抛出增强)— afetrThrow()
- 最终通知 — after 无论方法是否发生异常,均会执行该通知。
- 环绕通知 — around 包围一个连接点(join point)的通知,如方法调用。这是最强大的一种通知类型。 环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行
- Aop的实现
- 引入坐标
- 添加命名空间
- 注解实现
- @Aspect 声明当前类是一个切面
- @Pointcut("execution (* com.xxxx.service..*.*(..) )") 表示拦截的范围
- Xml实现
- Aop 理解
-
1. 面向切面,相比oop 关注的是代码中的层 或面
2. 解耦,提高系统扩展性
3. 提高代码复用