Spring AOP之一

介绍

AOP通过提供另一种方式的编程结构补充了OOP。组件的关键单元是类,AOP中的关键单元是切面。切面使得我们的关注点模块化,比如事物管理,穿插了多种类型和对象。(比如关注点通常被称为交叉关注)。


Spring的关键组件之一是AOP框架。Spring IoC容器与AOP之间没有依赖关系,意味着如果你不想使用,就不需要使用AOP,AOP为Spring IoC提供了一个非常有用的中间件解决方案。


Spring 2.0 AOP


Spring 2.0介绍了一种更加简单和更加强大的方式来写自定义的切面,要不是一个基于schema的方式或者@AspectJ的注解。两种方式都提供全类型建议和AspectJ切点语言,仍旧使用Spring AOP织入。


Spring 2.0 基于AOP的schema和@AspectJ支持在这一章节讨论。Spring 2.0依旧兼容Spring 1.2 AOP。


在Spring框架中使用的AOP:


  • 提供声明式的企业服务,尤其是为EJB声明式服务作为替代。最重要的这种服务是声明式事物管理。
  • 允许使用者实现自定义的的切面,使用AOP实现它们OOP的使用。


注意:如果你对一般的声明式业务或者其他的pre-packaged声明式中间件业务,比如池感兴趣,你不需要直接使用AOP,就跳过。


9.1.1 AOP概念

         先了解一些关键的AOP概念和术语。这些术语不是Spring指定的,----很不幸,AOP术语不是凭直觉命名的,然而,如果Spring使用自己的术语,将更加复杂。

  • AOP 代理:由AOP框架创建的对象来实现切面合约(建议方法执行等等)。在Spring框架中,一个AOP代理是一个JDK动态代理或者一个CGLIB代理
  • 目标对象:被一个或者更多的切面建议的对象。也作为一个建议对象。由于Spring AOP是用运行期代理实现,这个对象总是一个代理对象
  • 切面:关注点的模块化,贯穿了多个类。事物管理是企业Java应用程序中横穿关注的一个很好的例子。在Spring AOP中,切面是使用普通类实现的(基于schema方式)或者普通类注解(使用@AspectJ方式)
  • Join point(加入点):程序执行期间的点,比如一个方法的执行或者一个执行的处理。在Spring AOP中,一个join point 总是代表一个方法的执行。
  • Advice: 在一个特殊的方法执行时调用的action。有不同类型的建议,包括around,before和after建议。许多AOP框架,包括Spring,模拟一个建议作为拦截器,并在join point周围维持着一个拦截器链。
  •  Pointcut(切点):配合join point的术语。建议与切点表达式关联并运行由切点匹配的任何join point(例如有某个名的方法执行)。由切点表达式匹配的join point概念对于AOP是至关重要的,并且Spring默认地使用AspectJ切点表达式。
  • Introduction:代表一个类型声明更多的方法或字段。Spring AOP允许你对任何建议的对象采用新的接口(还有对应的实现)。例如,你可以使用一个引进来使得一个bean实现IsModified接口,来简化缓存(一个介绍作为AspectJ社区的内类型声明)。
  • 织入:使用其他应用程序类型或对象连接切面创建一个建议的对象。这在编译期间可以做(使用AspectJ编译器),或者运行期间。Spring AOP,如同其他纯净的Java AOP框架,在运行期间执行织入。


建议类型

  •         Before 建议:advice在一个join point前执行,但是不会阻止执行流向join point(除非抛出异常)
  •         After returning advice:在一个join point 正常完成后要执行的advice。例如,如果返回一个方法而不抛出异常
  •         After throwing advice:  如果一个方法由抛出异常退出执行建议
  •         After(finally)advice:  不管join point 如何退出(正常或者异常返回)要执行的advice
  •         Around advice:  环绕一个join point 的的Advice 比如一个方法的调用。这是最强的Advice。Around Advice可以在方法调用前和后执行自定义的行为。它也负责选择是否继续执行join point或者切断advised方法执行,通过返回其自己的返回值或者返回异常。

Around Advice是最常用的Advice。因为Spring AOP,像AspectJ,提供了全范围的建议类型,我们建议你使用不是最强的Advice类型,其可以实现必须的行为。例如,如果你仅需要通过一个方法的返回值更新缓存,你最好使用After returning Advice 而不是Around Advice,虽然Around Advice也可以完成这件事情。使用最合适的Advice类型提供了更简单的编程模型,而且有更少的潜在错误。例如,你不需要调用JoinPoint上的proceed()方法,用于Around Advice,并且因此你要成功调用它。


在Spring2.0中,所有的建议参数是静态类型的,这样你使用合适类型的建议参数(例如,从一个方法调用中返回值的类型)而不是对象数组。


join points的概念,由切点匹配,是AOP的关键,从老的仅提供拦截的技术中区分它。切点使得建议成为面向对象级别的目标性依赖。例如,around Advice提供的声明式事务管理能应用于一组方法来生成多个对象(比如service层的所有业务操作)。


9.1.2 Spring AOP 功能和目标

Spring AOP是由Java实现。不再需要特殊编译处理。Spring AOP不需要控制类加载的层次,并且在Servlet容器或者应用程序的server中很适合使用。


Spring AOP当前仅支持方法调用加入点(建议在Spring beans上执行方法)。字段拦截没有实现,虽然添加字段拦截支持不会破坏核心Spring AOP APIs。如果你需要字段访问和更新加入点,考虑语言,比如AspectJ。


Spring AOP的访问AOP的方式与其他AOP框架不同。目标不是支持最全的AOP实现(虽然Spring AOP有这个能力),而是提供AOP实现和Spring IoC之间紧密的集成,来解决企业应用程序中一般的问题。


例如,Spring AOP框架一般与Spring IoC容器一起使用。AspectJ使用普通的Bean定义语言配置(虽然这个允许更强大的自动代理功能):这是与AOP实现最大差异的地方。有些活儿,你使用Spring AOP也不是容易或者高效的做,比如通知非常细粒度的对象(比如一般的领域对象):对于这种情况,AspectJ是最好的选择。然而,我们的经验是Spring AOP提供了为大多数企业应用程序提供了完美的解决方案,这对于AOP是禁得起检验的。


Spring AOP从不认为使用AspectJ可以提供一个综合的AOP解决方案。我们认为基于代理的框架,比如Spring AOP和综合的框架,比如AspectJ,两者都是很重要的,而且它们是互补的而不是独立分开的。Spring无缝地使用AspectJ集成AOP和IoC,


注意:Spring框架的核心原理之一是代码非侵入;即你不应该将框架指定的类和接口参合到你的业务/领域模型中。然而,在某些地方,Spring框架也允许你将Spring指定的类和接口嵌入到你的代码基中:给出这样选择的理由是在某些情节中,以这种方式读或者编码某些功能更加方便。Spring框架总是提供你这样的选择:你可以选择最适合方式满足你的开发需求。


只要与这章节关联的选择是AOP框架。你可以选择使用AspectJ或者Spring AOP,并且你也选择@AspectJ注解访问方式或者Spring XML配置方式。然而这章节选择的是@AspectJ类型方式。


8.1.3 AOP代理

Spring AOP默认使用标准JDK动态代理作为AOP代理。这使得任何接口能被代理。


Spring AOP也可以使用CGLIB代理。适用于代理类而不是接口。如果业务对象不实现任何接口,默认使用CGLIB。由于相对于类而言,其更适用于接口编程,业务类通常实现一个或者多个业务接口。可能强制使用CGLIB,在这种情况下,你需要在一个接口上介绍一个未声明的方法,或者你需要传递一个代理对象,以具体的类型给方法。


Spring AOP是基于动态代理的是很重要的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值