AOP的基本概念
AOP,面向切面编程。一种程序设计思想,是对OOP的一种完善与补充
Why
AOP可以说是OOP的补充和完善。
OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。
然而OOP还有无能为力的场合,比如当需要分散的、不具有继承层次的对象引入公共行为的时候,OOP则无法避免代码的重复。
抽象地说,OOP允许定义从上到下的关系,但并不适合定义从左到右的关系。
具体而言,比如安全验证和记录日志功能,这类代码往往平均的分散在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。
AOP采取横向抽取机制,取代了传统的纵向继承体系解决重复性代码的问题(安全检查、事务管理、性能监视、数据缓存等)
When
Ajax.即异步传输,可以在不完全刷新页面的情况下,动态的修改页面上的内容,是一种用于创建更好的更快交互性更强web应用程序的技术。
What
横切
AOP思想的核心是“横切”,将对象剖开,抽出一些内部的属性和行为,处理后再将剖面复原,不留痕迹。那些被打开的剖面,就是所谓的切面(aspect)。
关注点(concern)
一个关注点可以是一个特定的问题、概念、或是应用程序的部分,即一段程序必须达到的以恶个目标,可以分为核心关注点和横切关注点
-
核心关注点
-
- 完成核心业务逻辑的关注点
-
横切关注点(crosscutting concern)
-
- 实现代码散落在很多个类或方法之中的关注点。在AOP中,将那些具有公共逻辑、与其他模块的核心逻辑纠缠在一起的行为称为“横切关注点”,它不是给定编程模型的核心职责。
-
切面
-
- 一个切面是对一个横切关注点的模块化,它将那些散落在各处的、实现横切关注点的代码归整在一起,类似于OOP中类的概念,但切面代表的更多是对象间横向的关系
连接点(join point)
连接点就是程序执行过程中的一个点,可能是:
-
Method invocation(方法调用)
-
Field access(字段访问)
-
Throws(异常抛出)
切入点(point cut)
- 一组join point的总称,用指定某个建议应该用于何处。
建议(advice)
- 切面切入目标代码的方式,是point cut的执行代码,是“切面”执行的具体逻辑。
前置建议(before advice)
- 在连接点调用之前,先调用advice
后置建议(after advice)
- 在连接点调用之后,再调用advice
-
- 成功执行后(after returning advice)
- 抛出异常后(after throwing advice)
- 不管是否异常后(after advice)
环绕建议(around advice)
- 完全控制所有连接点
引介(introduction)
- 为一个现有的Java类或接口添加方法或字段。
混入继承(mixin inheritance)
- 一个混入类封装了一组功能,这组功能可能被“混入”到现有的类中,并且无需求助于传统的继承手段。在AOP里,mixin通过introduction来实现。
织入(weaving)
- 将切面整合到完整的执行流程或完成的类的过程
AOP实现技术
- Java SE动态代理
- 动态字节码生成
- Java代码生成
- 语言扩展
AOP实现技术——动态代理
动态代理实现AOP
-
代理解决的问题:当两个类需要通信时,引入第三方代理类,将两个类的关系解耦
-
代理的完成与另一个类之间的关系的统一管理
-
代理类和委托类要实现相同的接口(代理调用的是委托类的方法),且一个动态代理可以代理多个类,只要实现的是同一个接口
-
一个动态代理类代理的是一个接口,一般就是对应一类业务
静态:由程序员创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了。
动态:在程序运行时运用反射机制动态创建而成。
动态横切
通过切入点和连接点在一个切面中创建行为的过程。
动态横切通常用于帮助向对象层次中的各种方法添加安全验证或日志记录。
在很多应用场景中,动态横切基本代表了AOP。动态横切的核心技术包括连接点、切入点、建议、切面。
静态横切
静态横切和动态横切的区别在于,静态横切不修改一个给定对象的执行行为。相反,它可以把扩展和实现附加到对象的基本结构中。
此外,它通过引入附加的方法字段和属性来修改对象的结构。
在AOP的实现中,通常静态横切也就是引入或混入。
How
用AspectJ实现动态横切
首先将创建好的Java工程转换为AspectJ工程
编写安全验证和日志记录切面(.aj结尾)
完成功能
用AspectJ实现静态横切
首先提供一个接口
然后将给功能引入(混入到)Product(用product继承该接口,在重写该功能的方法)
若又有需求,只需将JDK中的Comparable接口织入到Product中即可若又有需求,希望Product类能按价格进行排序。
Spring AOP
Spring中支持AOP的多种实现方式,包括动态代理\字节码生成和AspectJ等,Aspect J AOP再Spring中也分为XML配置和注解两种方式.
<app:config>
<!--配置切入点-->
<aop:pointcut id="pointcut1" expression="execution(*完整类名.方法名)"/>
<!--配置切面-->
<aop:aspect ref="myAspectXml">
<aop:before method="afterrunning" piont-cut-ref="pointcut1" returning="result"/>
</aop:aspect>
</app:config>