spring AOP的基本概念

AOP的概念和使用缘由

  现实中有一些内容并非面向对象(OOP)能够解决的,好比数据库事务,它对于企业级的Java EE应用而言是十分重要的,又如在电商网站购物须要通过交易系统、财务系统,对于交易系统存在一个交易记录的对象,而财务系统则存在帐户的信息对象。从这个角度而言,咱们须要对交易记录和帐户操做造成一个统一的事务管理。交易和帐户的事务,要么所有成功,要么所有失败。
  交易记录和帐户记录都是对象,这两个对象须要在同一个事务中控制,这就不是面向对象能够解决的问题,而须要用到面向切面的编程,这里的切面环境就是数据库事务。
  AOP编程有着重要的意义,首先它能够拦截一些方法,而后把各个对象组织成一个总体,好比网站的交易记录须要记录日志,若是咱们约定好了动态的流程,那么就能够在交易先后、交易正常完成后或者交易异常发生时,经过这些约定记录相关的日志了。

  回到JDBC的代码中,使人最讨厌和最折腾的问题永远是无穷无尽的try...catch...finally...语句和数据库资源的关闭问题,并且这些代码会存在大量重复,加上开发者水平良莠不齐。Spring出现前,在Java EE的开发中,try...catch...finally语句经常被严重滥用,使得Java EE的开发存在着许多问题,虽然MyBatis对JDBC作了良好的封装,可是仍是不足的。

 


  这里购买交易的产品和购买记录都在try...catch...finally...语句中,首先须要本身去获取对应的映射器,而业务流程中穿插着事务的提交和回滚,也就是若是交易能够成功,那么就会提交事务,交易若是发生异常,那么就回滚事务,最后在finally语句中会关闭SqlSession所持有的功能。
  可是这并非一个很好的设计,按照Spring的AOP设计思惟,它但愿写成如代码清单所示的代码。

 



  这段代码除了一个注解@Transactional,没有任何关于打开或者关闭数据库资源的代码,更没有任何提交或者回滚数据库事务的代码,可是它却可以完成如代码清单所示的所有功能。注意,这段代码更简洁,也更容易维护,主要都集中在业务处理上,而不是数据库事务和资源管控上,这就是AOP的魅力。 
 

面向切面编程的术语

1. 切面(Aspect)
  切面就是在一个怎么样的环境中工做。好比数据库的事务直接贯穿了整个代码层面,这就是一个切面,它可以在被代理对象的方法以前、以后,产生异常或者正常返回后切入你的代码,甚至代替原来被代理对象的方法,在动态代理中能够把它理解成一个拦截器。

2. 通知(Adice)
  •通知是切面开启后,切面的方法。它根据在代理对象真实方法调用前、后的顺序和逻辑区分,它和约定游戏的例子里的拦截器的方法十分接近。
  •前置通知(before):在动态代理反射原有对象方法或者执行环绕通知前执行的通知功能。
  •后置通知(after):在动态代理反射原有对象方法或者执行环绕通知后执行的通知功能。不管是否抛出异常,它都会被执行。
  •返回通知(afterReturning):在动态代理反射原有对象方法或者执行环绕通知后执行的通知功能。   
  •异常通知(afterThrowing):在动态代理反射原有对象方法或者执行环绕通知产生异常后执行的通知功能。
  •环绕通知(aroundThrowing):在动态代理中,它能够取代当前被拦截对象的方法,经过参数或反射调用被拦截对象的方法。

3. 引入(Introduction)
  引入容许咱们在现有的类里添加自定义的类和方法。

4. 切点(Pointcut)
  在动态代理中,被切面拦截的方法就是一个切点,切面将能够将其切点和被拦截的方法按照必定的逻辑织入到约定流程当中。

5. 链接点(join point)
  链接点是一个判断条件,由它能够指定哪些是切点。对于指定的切点,Spring会生成代理对象去使用对应的切面对其拦截,不然就不会拦截它。

6. 织入(Weaving)
  织入是一个生成代理对象的过程。实际代理的方法分为静态代理和动态代理。静态代理是在编译class文件时生成的代码逻辑,可是在Spring中并不使用这样的方式,因此咱们就不展开讨论了。一种是经过ClassLoader也就是在类加载的时候生成的代码逻辑,可是它在应用程序代码运行前就生成对应的逻辑。还有一种是运行期,动态生成代码的方式,这是Spring AOP所采用的方式,Spring是以JDK和CGLIB动态代理来生成代理对象的

 

Spring对AOP的支持

  AOP并非Spring框架特有的,Spring只是支持AOP编程的框架之一。每个框架对AOP的支持各有特色,有些AOP可以对方法的参数进行拦截,有些AOP对方法进行拦截。而Spring AOP是一种基于方法拦截的AOP,换句话说Spring只能支持方法拦截的AOP。在Spring中有4种方式去实现AOP的拦截功能。
  •使用ProxyFactoryBean和对应的接口实现AOP。
  •使用XML配置AOP。
  •使用@AspectJ注解驱动切面。
  •使用AspectJ注入切面。
  在Spring AOP的拦截方式中,真正经常使用的是用@AspectJ注解的方式实现的切面,有时候XML配置也有必定的辅助做用。对于ProxyFactoryBean和AspectJ注入切面的方式这两种方式已经不多用了。数据库

相关文章
相关标签/搜索