什么是AOP
- Aspect-Oriented Programming 面向切面编程
- 相对于OOP
- AOP是面向切面编程
- 关注的不是对象本身,而是一个统一的切面
AOP适用的场景
- 需要统一处理的场景
- 日志
- 缓存
- 鉴权
- 如果不是用AOP,而是用OOP来做
- 装饰器模式
Decorator pattern
- 动态地为一个对象增加功能,但是不改变其结构
- 本质上是一个“包装”
- 被包装的类,要被包装的每个方法,在装饰器(类)都要写一次
- 用AOP解决这个问题
AOP的实现
1. JDK动态代理
- Proxy
```java MyService myService = (MyService) Proxy.newProxyInstance( service.getClass().getClassLoader(), new Class[]{MyService.class}, new LogProxy(service) );
// LogProxy public class LogProxy implements InvocationHandler { MyService delegate;
public LogProxy(MyService delegate) {this.delegate = delegate;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println(method.getName() + "is invoked");Object value = method.invoke(delegate, args);System.out.println(method.getName() + "is finished");return value;}
} ```
2. 字节码生成
- CGLIB/ByteBuddy字节码生成
- 原理都是通过字节码动态生成一个enhance类
- 优点:强大,不受接口的限制
- 缺点:
- 需要引用额外的第三方类库
- 使用继承的方式,不能增强final类,final/private方法(JDK动态代理也有这个缺陷)
