AOP的实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AOP的实现相关的知识,希望对你有一定的参考价值。

参考技术A

AOP 是一个概念,一个规范,本身并没有设定具体语言的实现,这实际上提供了非常广阔的发展的空间。AspectJ是AOP的一个很悠久的实现,它能够和 Java 配合起来使用。
介绍 AspectJ 的使用和编码不是本文的目的,你可以在 Google 上找到很多有关它的材料。
这里只是重温 AspectJ 中几个必须要了解的概念:
Aspect: Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。
Joint point:表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point。
Pointcut:表示一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。
Advice:Advice 定义了在 pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码。
下面要讨论的这些问题,也许正是接触了 AOP 之后所困惑的。
AOP 帮助我们解决了新的问题没有?
AOP 并没有帮助我们解决任何新的问题,它只是提供了一种更好的办法,能够用更少的工作量来解决现有的一些问题,并且使得系统更加健壮,可维护性更好。同时,它让我们在进行系统架构和模块设计的时候多了新的选择和新的思路。

AOP 实现的原理简析

AOP简介

AOP为Aspect Oriented Programming的缩写,意为:面向切面编程(也叫面向方面),可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。

AOP应用范围日志记录,跟踪,优化和监控,事务的处理,持久化,如数据库连接池的管理,系统统一的认证、权限管理等.AOP的实现

AOP实现可以分为两种:

1.静态织入(AspectJ)

在代码的编译阶段植入Pointcut的内容 ,优点是性能好

2.动态代理(Spring)

在代码执行阶段,在内存中截获对象,动态的插入Pointcut的内容,优点是不需要额外的编译,但是性能比静态织入要低

 

Spring AOP

在Spring 中,虽然引入了AspectJ的语法,但是他本质上使用的是动态代理的方式.但即使是动态代理,也分两种实现模式:

1.使用接口(动态代理)

如果被代理的对象是面向接口编程的,那么Spring直接使用实现这些接口,然后把需要插入的内容在这个接口上下文中插入

2.使用继承(CGLIB)

如果被代理的对象没有基于接口编程,那么Spring会调用cglib库,通过子类继承的方式,动态插入需要的内容,并且调用父类的方法实现

cglib内部拥有一个小的字节码处理框架asm,来转换字节码生成新的类.所以spring调用了cglib,相当于生成了一个被代理对象的子类,来取代被代理对象.

 

结语

以上只是针对动态代理的一些资料的总结和个人的理解.动态代理没有那么神秘,同时也没那么简单,它深入到了java比较底层的地方,或者运用了比较高级的技术实现.通过学习和挖掘aop的实现机制,可以更加深入的了解技术本质,同时更好的运用这个技术.

 

以上是关于AOP的实现的主要内容,如果未能解决你的问题,请参考以下文章

.Net 框架实现AOP(动态代理实现AOP,本文为翻译)

spring实现aop的几种方式及其适用场合

AOP 实现的原理简析

AOP实现日志打印 基于xml配置的AOP实现 切入点表达式

使用Spring配置文件实现AOP

Spring_AOP的实现机制-动态代理