面向切割面编程(AOP )是通过允许跨关注点的分离来提高模块化的编程范例。 AOP提供了将对象之间的关注点模块化的切面。
AOP实现的是根据我们编写的代码进行一定的包装处理,例如在方法执行前、执行后或执行过程中发生异常后。 称为扩展处理
Aop概念
Pointcut :基于正则表达式的(组)表示,有点绕圈子。 也就是说,他自己是表达,但他是基于正规语法的。 通常,pointcut会选择程序中的几个感兴趣的执行点或程序执行点的集合。
连接点: pointcut选择的集合中的具体执行点称为连接点。
Advice :在选定的连接点上执行的操作,逻辑。 对于五种类型,我很少说,但不懂的同学会自己补充基础。
Aspect :是我们关注点的模块化。 该关注点可能跨越多个对象和模块,事务管理是跨越关注点的好例子。 这是一个抽象的概念,从软件的角度来看,是指APP应用程序的各个模块中的任何一个领域或方面。 它还由pointcut和advice组成。
Weaving :将切片应用于目标对象以创建新advised对象的过程。
AspectJ是一个易于使用的强大的AOP框架
AspectJ的全名是Eclipse AspectJ,官方网站地址为1.9.0,目前最新版本
引用官方网站的说明:
aseamlessaspect-orientedextensiontothejavatmprogramminglanguage (基于Java平台的面向断开编程的语言) () ) ) ) ) ) ) ) ) )
javaplatformcompatible (与Java平台兼容,可无缝扩展) ) ) ) )。
() ) ) )。
可以单独使用,也可以集成到其他框架中。
单独使用AspectJ时,需要专用的编译器ajc。
java的编译器是javac,AspectJ的编译器是ajc,aj是首字母缩写,c是compiler。
和AspectJ
作为Java开发人员,我相信我们熟悉一个叫Spring的框架。 Spring框架具有AOP这一主要功能,说起AOP,人们往往会想到AspectJ。 让我们简单比较一下AspectJ和Spring AOP :
Spring AOP
1 .基于动态代理实现。 缺省情况下,使用接口时用JDK提供的动态代理实现,方法时用CGLIB实现
2、Spring AOP需要依赖IOC容器进行管理,只能作用于Spring容器,通过纯Java代码实现
3、性能方面,Spring AOP是基于动态代理实现的,所以容器启动时需要生成代理实例,方法调用也会增加堆栈深度,Spring AOP的性能不如AspectJ好
AspectJ
AspectJ来自Eclipse基金会
AspectJ是静态组织,通过修改代码来实现,具有以下组织时机。
1、编译期组织(Compile-time weaving ) :如果a类使用AspectJ添加属性,b类引用该属性,则该场景在需要编译期时组织,否则编译b类
2、编译后的组织(Post-compile weaving ),也就是说,生成了. class文件,或者是jar包。 在这种情况下,如果我们需要加强处理,就用于编译后的织入。
3、等级加载后的编织(Load-time weaving ) :指等级加载时进行编织。 实现这一时期的穿插有几种常见的方法。 1、定制班级加载器做这个。 我认为这是最容易考虑的方法。 在将组织的类加载到JVM中之前加载它。 这样,可以在加载时定义行为。 2、JVM启动时指定AspectJ提供的代理:-javaagent : XXX/XXX/AspectJ weaver.jar。
AspectJ可以用Spring AOP做不到。 它是AOP编程的完整解决方案,Spring AOP致力于解决企业级开发中最常见的AOP。 而不是成为像AspectJ那样的AOP方案
由于AspectJ在实际运行之前已完成组织,因此生成的类没有额外的运行时开销
比较总结
下表总结了Spring AOP和AspectJ之间的主要区别:
Spring AOP
AspectJ
在纯Java中实现
使用Java编程语言的扩展实现
不需要单独的编译过程
除非设置LTW,否则需要AspectJ编译器(ajc )
仅可使用运行时编织
不能使用运行时编织。 支持编译时、编译后、加载时的编织
功能不强-仅支持方法级组织
更强大-允许组织字段、方法、构造函数、静态初始值设置项、最后一个类/方法等。
只能在Spring容器管理的bean中实现
可以在所有域对象中实现
仅支持方法的执行起点
支持所有切入点
代理由目标对象创建,片应用于这些代理
在执行APP应用程序之前(执行时),各方面直接编入代码中
比AspectJ慢多了
提高性能
易于学习和应用
比Spring AOP更复杂