spring AOP自己见解

来源:互联网 发布:梦幻西游五彩娃娃数据 编辑:程序博客网 时间:2024/06/05 12:10

面向切面编程:

什么是面向切面:
AOP:也是一种复用的手段,和继承差不多,但是解决了横切对象和应用对象之间的解耦
如果使用继承,整个应用系统很多地方都得使用相同的基类,比如在Android开发中Activity和Service它们都有可能用到缓存处理(举个例子,缓存可以和网络请求处理一起放在数据处理层和控制层分离),如果把缓存放到基类中,那么activity和service都要分别创建一个包含该功能的基类,因为很难修改activity和service的基类,它在framework中。因此基于继承的复用在系统级别是很难实现的,应为应用范围越大,系统中可能包含多个角度的划分,你要修改基类会造成很大影响。另外使用继承本身还会造成类数量”爆炸“,使得系统庞大臃肿。
委托:
而是用委托可以很大程度上解决,但是委托一般使用组合的方式对接受委托对象进行调用,被委托的服务对委托者来说仍旧是可见的,有时可能需要对委托对象进行复杂的调用,使得类与类之间的联系变得不是很清晰
通知(advice):通知决定切面何时使用,是方法前还是方法后,spring提供了5种选择,Before,After,After-returning(成功后调用),After-throwing(异常后调用),Around(包含方法,前后执行自定义行为);
切面:joint point:即java线程流
如果从虚拟机线程栈的角度考虑Java程序执行的话,那么,你会发现,真个程序运行的过程就是方法调用的过程。我们按照方法执行的顺序,将方法调用排成一串,这样就构成了Java程序流。
我们将上述的线程栈里的方法调用按照执行流排列,会有如下类似的图:


AOP(Aspect Oriented Programming)则是从另外一个角度来考虑整个程序的,AOP将每一个方法调用,即连接点作为编程的入口,针对方法调用进行编程。从执行的逻辑上来看,相当于在之前纵向的按照时间轴执行的程序横向切入。相当于将之前的程序横向切割成若干的面,即Aspect.每个面被称为切面。
所以,根据我的理解,AOP本质上是针对方法调用的编程思路。

在我认为:

因为切面本质上是每一个方法调用,选择切面的过程实际上就是选择方法的过程。那么,被选择的切面(Aspect)在AOP术语里被称为切入点(Point Cut).  切入点实际上也是从所有的连接点(Join point)挑选自己感兴趣的连接点的过程。

我们假设在我们的Java代码里,都为实例对象通过代理模式创建了代理对象,访问这些实例对象必须要通过代理,那么,加入了proxy对象的Java程序执行流会变得稍微复杂起来。
我们来看下加入了proxy对象后,Java程序执行流的示意图:

代理模式:

spring AOP的工作原理:


AOP应该实现:
1.确定自己对什么类的什么方法感兴趣? -----即确定 AOP的切入点(Point Cut),这个可以通过切入点(Point Cut)表达式来完成;
2. 对应的的类的方法的执行特定时期给出什么处理建议?------这个需要Spring AOP提供相应的建议 ,即我们常说的Advice。



原创粉丝点击