AOP(Aspect Oriented Programming)面向切面编程
我的理解点
- 编程思想演进过程,面向过程编程POP(Procedure Oriented Programming)、面向对象编程OOP(Object Oriented Programming)、面向切面编程AOP(Aspect Oriented Programming),POP和OOP是处理不同场景的两种想法,AOP是对OOP不足之处的补充
- 项目中加入AOP代码时不应该对业务代码有侵入性,而是应该对接入点(Joinpoint)进行仔细编写,精确匹配需要切的类或者方法
- AOP是提取公共代码的一种方式,当项目中多处模块会使用同样的代码,就可以将这个同样代码提取一个切面类中
AOP基本概念
- Joinpoint(接入点),程序执行中的要点。例如,joinpoints可以定义对类中特定方法的调用,我的理解应该就是编写匹配类或者方法的语句
- Pointcuts(切入点),用于指定连接点并在这些点处收集特定上下文的程序构造,我的理解就是定义的那个空的方法,结合接入点成为一个可以被调用的就是切入点。
- Advices(通知),满足特定条件时运行的代码。例如,建议可以在执行连接点之前记录消息。五个通知点,前置通知(before)、报错通知(after throwing)、后置通知(after)、环绕通知(around)、返回通知(after returning)
- Aspect(切面),切入点和通知的结合
- Weave(织入),将切面代码织入到目标程序中的方式,分为动态织入和静态织入。
扩展概念
- 静态织入就是在编译期间,利用ajc编译器,将切面代码编入目标代码中。
- 动态织入又分JDK代理方式和cglib方式
- JDK代理方式,底层是通过反射方式实现的,需要代理类要实现接口。Java中大致实现方式是,实现InvocationHandler,实现invoke方法
- cglib方式,底层是通过继承方式实现的,cglib会用字节码方式生成代理类的子类,实现MethodInterceptor,实现intercept方法