名词解释
AOP:Aspect Oriented Programming
面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
什么是“切面”?
生活中,用刀把水果切开,切开后的表面就是切面;炒菜,锅与炉子之间的就是切面; 软件设计中,WEB层-网关层-服务层-数据层-持久层,每一层之间也是一个切面; 代码中,对象与对象之间,方法与方法之间,模块与模块之间都是切面。
什么是“横向扩展”?
先举个栗子,有这么一个需求: 某公司普通员工申请事假流程为:申请人——>项目经理——>部门经理,并且审批不通过时必须通知申请人。
这种不复杂也不简单的流程类需求,我们可以用模板方法模式实现,或者JAVA8的default关键字实现,但是这里主要讲AOP,就用切面去实现。
假设Vinsea要申请事假了,那么正常流程就是:
可以看到,红色部分是重复的部分,写代码的时候就是无脑复制粘贴,俗称CV大法。 现在开始改进,将红色部分提出为公用方法 A:
重复部分没有了,但是每次审批完都需要调用方法 A,这时候,我们将审批后的这个公用方法完全拿出来,不放在流程中,原来的流程变成:
现在要通过某种手段,把这个公用方法在每次审批完后调用一下,这个就是切面,将公用代码切入流程的某一面中。
最后这一步,就是面向切面编程,主流程只需要保证正确的审批流程,不需要关注其他附加的功能。
这么一看,不就是这个公用方法把每次审批后的方法给拦截了吗? 对!Struts2的拦截器设计就是基于AOP的思想。
在程序中使用
要在代码中使用需要先知道几个知识点
Aspect(切面)
通常是一个类,里面可以定义切入点和通知
JointPoint(连接点)
程序执行过程中明确的点,一般是方法的调用
Advice(通知)
AOP在特定的切入点上执行的增强处理,有before,after,afterReturning,afterThrowing,around
Target(目标对象)
织入 Advice 的目标对象。
Weaving(织入)
将 Aspect 和其他对象连接起来, 并创建 Adviced object 的过程
Pointcut(切入点)
就是带有通知的连接点,在程序中主要体现为书写切入点表达式
AOP代理
AOP框架创建的对象,代理就是目标对象的加强。Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类
上面提到的Advice的通知类型都是什么意思:
Before
在目标方法被调用之前做增强处理,@Before只需要指定切入点表达式即可
AfterReturning
在目标方法正常完成后做增强,@AfterReturning除了指定切入点表达式后,还可以指定一个返回值形参名returning,代表目标方法的返回值
AfterThrowing
主要用来处理程序中未处理的异常,@AfterThrowing除了指定切入点表达式后,还可以指定一个throwing的返回值形参名,可以通过该形参名来访问目标方法中所抛出的异常对象
After
在目标方法完成之后做增强,无论目标方法时候成功完成。@After可以指定一个切入点表达式
Around
环绕通知,在目标方法完成前后做增强处理,环绕通知是最重要的通知类型,像事务,日志等都是环绕通知,注意编程中核心是一个ProceedingJoinPoint
明天再写吧,李傻子要看电影...
参考: https://www.jianshu.com/p/570c5283b1fchttps://www.cnblogs.com/Wolfmanlq/p/6036019.html