AOP:面向切面编程,一种编程范式,无关语言。大部分语言都可以使用。
使用AOP的好处:
1、集中处理某个切入点/横切逻辑
2、更容易删除、添加切点
3、解耦,增强程序可读性
应用场景:
1、权限控制
2、事务控制
3、缓存控制
4、日志处理
5、性能控制
6、分布式追踪
7、异常处理
切面表达式:
通配符:
* 表示任意
..表示一个包
+ 指定类及其子类
代理模式:
一共存在三种角色:客户端、代理对象、目标对象。
客户端通过代理对象间接和目标对象交互,也就是说目标对象委托代理对象和客户端交互。
以下是UML模型图:
有两个关键点:
1、客户端是通过接口来引用目标/代理对象(也正是符合了Java的面向对象编程(面向接口编程))
2、代理对象把真正的业务逻辑 委托给 目标对象,自己则处理额外的逻辑。
代码:
接口:
public interface Subject {
void request();
}
目标对象
public class RealSubject implements Subject {
@Override
public void request() {
System.out.println("subject real execute request");
}
}
代理对象:
public class Proxy implements Subject {
private RealSubject realSubject;
public Proxy(RealSubject realSubject) {
this.realSubject = realSubject;
}
@Override
public void request() {
System.out.println("before");
try {
realSubject.request();
}catch (Exception e){
System.out.println("e:"+e.getMessage());
}finally {
System.out.println("after");
}
}
}
客户端:
public class TestClient {
public static void main(String[] args) {
Subject subject = new Proxy(new RealSubject());
subject.request();
}
}
输出结果:
before
subject real execute request
after
以上的代理模式称为静态代理,缺点就是一个接口,需要创建一个代理对象,如果接口很多或者接口新增方法,都很不方便。
以下介绍动态代理:消除代码
jdk代理和cglib代理
jdk代理 实现InvocationHandler 接口