AOP 笔记(一)
分类:
文章
•
2024-10-23 21:00:16
一、AOP概述
- 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术
- AOP是OOP(面向对象编程)的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型
- 利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率
- AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码
- 经典应用:事务管理、性能监视、安全检查、缓存 、日志等【画图】
- Spring AOP使用纯Java实现,不需要专门的编译过程和类加载器,在运行期通过代理方式向目标类织入增强代码
-
AspectJ是一个基于Java语言的AOP框架,Spring2.0开始,Spring AOP引入对Aspect的支持,AspectJ扩展了Java语言,提供了一个专门的编译器,在编译时提供横向代码的织入
二、AOP实现原理
- aop底层将采用代理机制进行实现
- 接口 + 实现类 :spring采用 jdk 的动态代理Proxy(非接口+实现的类型无法使用)
- 实现类:spring 采用 cglib 字节码增强
三、AOP术语
-
target:目标类,需要被代理的类。例如:UserService
-
Joinpoint(连接点):所谓连接点是指那些可能被拦截到的方法。例如:所有的方法
-
PointCut(切入点):已经被增强的连接点。例如:addUser()
-
advice 通知/增强,增强代码:例如:after、before
-
Weaving(织入):是指把增强advice应用到目标对象target来创建新的代理对象proxy的过程
-
proxy:代理类
-
Aspect(切面): 是切入点pointcut和通知advice的结合
7.1 一个线是一个特殊的面
7.2 一个切入点和一个通知,组成成一个特殊的面
-
关系图
四、AOP 联盟通知类型
- AOP联盟为通知Advice定义了org.aopalliance.aop.Advice
Spring按照通知Advice在目标类方法的连接点位置,可以分为以下5类
- • 前置通知 org.springframework.aop.MethodBeforeAdvice
• 在目标方法执行前实施增强
- • 后置通知 org.springframework.aop.AfterReturningAdvice
• 在目标方法执行后实施增强
- • 环绕通知 org.aopalliance.intercept.MethodInterceptor
• 在目标方法执行前后实施增强
- • 异常抛出通知 org.springframework.aop.ThrowsAdvice
• 在方法抛出异常后实施增强
- • 引介通知 org.springframework.aop.IntroductionInterceptor
• 在目标类中添加一些新的方法和属性
五、个人总结
- 所谓面向切面编程,我们应该与纵向编程类比理解
- 在之前做 Javaweb 项目时候,当遇到 Servlet 中重复出现的部分,我们会考虑将这一部分抽取出来,写一个 BaseServlet 的父类。之后,其他所有的需要用到这个父类方法的 Servlet 都继承自这个父类。
- 这就是纵向的继承调用,那么显然每继承一次,就耦合了一次。为了降低耦合,提出了 AOP 面向切面编程。
- 思想:构造切面类,对指定的目标对象进行拦截,在拦截到对象之后,在此对象执行之前,之后或前后,执行一些需要增加的功能(BaseServlet)
- 逻辑:声明目标类,声明切面类,使用代理把切面类应用到目标类,最后返回一个代理