AOP是什么(Aspect Oriented Programming)
- AOP是一种编程范式,提供从还有一个角度来考虑程序结构以完好面向对象编程(OOP)。
- AOP为开发人员提供了一种描写叙述横切关注点的机制,并可以自己主动将横切关注点织入到面向对象的软件系统中。从而实现了横切关注点的模块化。
- AOP可以将那些与业务无关,却为业务模块所共同调用的逻辑或责任。比如事务处理、日志管理、权限控制等。封装起来,便于降低系统的反复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。
AOP能干什么,也是AOP带来的优点
- 减少模块的耦合度
- 使系统easy扩展
- 设计决定的迟绑定:使用AOP,设计师能够推迟为将来的需求作决定,由于它
- 能够把这样的需求作为独立的方面非常easy的实现。
- 更好的代码复用性
在传统的编写业务逻辑处理代码时,我们一般会习惯性地做几件事情:日志记录、事务控制及权限控制等,然后才是编写核心的业务逻辑处理代码。当代码编写完毕回头再看时,不禁发现。扬扬洒洒上百行代码中。真正用于核心业务逻辑处理才那么几行。如图6-4所看到的。
方法复方法。类复类,就这样子带着无可奈何遗憾地度过了多少个春秋。这倒也罢。倘若到了项目的尾声,突然决定在权限控制上须要进行大的变动时。成千上万个方法又得一一"登门拜訪",痛苦"雪上加霜"。
假设能把图6-4中众多方法中的所有共同拥有代码所有抽取出来,放置到某个地方集中管理。然后在详细执行时,再由容器动态织入这些共同拥有代码的话,最起码能够解决两个问题:
Java EE程序猿在编写详细的业务逻辑处理方法时,仅仅需关心核心的业务逻辑处理,既提高了工作效率。又使代码变更简洁优雅。
在日后的维护中因为业务逻辑代码与共同拥有代码分开存放。并且共同拥有代码是集中存放的,因此使维护工作变得简单轻松。
面向切面编程AOP技术就是为解决问题而诞生的。切面就是横切面,如图6-5所看到的,代表的是一个普遍存在的共同拥有功能,比如。日志切面、权限切面及事务切面等。
以下我们以用户管理业务逻辑组件UserService的AOP实现过程(见图6-6)为例,深度剖析一下AOP技术的实现原理。AOP技术是建立在Java语言的反射机制与动态代理机制之上的。业务逻辑组件在执行过程中,AOP容器会动态创建一个代理对象供使用者调用,该代理对象已经按Java EE程序猿的意图将切面成功切入到目标方法的连接点上。从而使切面的功能与业务逻辑的功能同一时候得以执行。从原理上讲,调用者直接调用的事实上是AOP容器动态生成的代理对象。再由代理对象调用目标对象完毕原始的业务逻辑处理。而代理对象则已经将切面与业务逻辑方法进行了合成。
现将图6-6中涉及到的一些概念解释例如以下。
切面(Aspect):由切点和增强组成,既包含了横切逻辑的定义。也包含了连接点的定义。
通知(Advice):是切面的详细实现。
以目标方法为參照点,依据放置的地方不同,可分为前置通知(Before)、后置返回通知(AfterReturning)、后置异常通知(AfterThrowing)、后置终于通知(After)与围绕通知(Around)5种。在实际应用中一般是切面类中的一个方法。详细属于哪类通知。相同是在配置中指定的。
连接点(Joinpoint):程序运行的某个特定的位置。比方类初始化前,初始化后。方法调用前。方法调用后等等
切入点(Pointcut):用于定义通知应该切入到哪些连接点上。
不同的通知通常须要切入到不同的连接点上,这样的精准的匹配是由切入点的正則表達式来定义的。
目标对象(Target):增强逻辑的织入目标类。
代理对象(Proxy):将通知应用到目标对象之后被动态创建的对象。
能够简单地理解为,代理对象的功能等于目标对象的核心业务逻辑功能加上共同拥有功能。代理对象对于使用者而言是透明的。是程序执行过程中的产物。
织入(Weaving):将切面应用到目标对象从而创建一个新的代理对象的过程。
这个过程能够发生在编译期、类装载期及执行期,当然不同的发生点有着不同的前提条件。
譬如发生在编译期的话。就要求有一个支持这样的AOP实现的特殊编译器;发生在类装载期,就要求有一个支持AOP实现的特殊类装载器;仅仅有发生在执行期,则可直接通过Java语言的反射机制与动态代理机制来动态实现。
增强:织入到目标类连接点上的一段代码