第 6 章 集成AspectJ

6.1. 概述

Spring基于代理的AOP框架很适合处理一般的中间件和特定应用的问题。 然而,有时,更强大的AOP方案也是需要的,例如,如果我们需要给一个类增加 额外的字段, 或者通知(Advise)一个不是由Spring IoC容器创建的细粒度的对象。

We recommend the use of AspectJ in such cases. Accordingly, as of version 1.1, Spring provides a powerful integration with AspectJ.

因为Spring很好的整合了AspectJ,所以这种情况下我们推荐使用AspectJ。

6.2. 使用Spring IoC配置AspectJ

Spring/AspectJ集成最重要的部分是允许Spring的依赖注射来配置AspectJ的aspect。 这给方面(aspect)和对象(object)带来了类似的好处。例如:

  • Aspect不需要使用特定的配置机制;它们可以使用和整个应用相同的、一致的方法来配置。

  • •Aspect可以依赖应用对象。例如,一个权限aspect可以依赖一个权限管理对象,稍后我们可以看到例子。

  • 可以通过相关的Spring上下文(Context)获得一个aspect的引用(reference),这可以允许动态的aspect配置。

AspectJ 的方式可以通过设值方式(setter)的注入Java Bean的属性,也可以通过实现Spring的生命周期接口来实现,例如实现 BeanFactoryAware

值得注意的是,AspectJ不能使用构造器注入方式和方法注入方式, 这是由于aspect没有类似对象的构造器那样可以调用方法的原因。

6.2.1. “单例”aspect

大多数情况下,AspectJ的aspect是单例的,每个类装载器一个实例, 这个单一的实例负责通知(advising)多个对象实例。

Spring IoC容器不能实例化aspect,因为,aspect没有可调用的构造器。 但是,它可以使用AspectJ为所有aspect定义的静态方法aspectOf()获得一个 aspect的引用,并且,能够把依赖注入aspect。

6.2.1.1. 举例

考虑一个关于安全的aspect,它依赖于一个安全管理对象。这个aspect应用于 Account类中实例变量balance的所有的值变化。(我们不能够以同样方法使 用Spring AOP做到这点。)

AspectJ中aspect的代码(Spring/AspectJ的一个例子),显示如下。注意, 对SecurityManager接口的依赖在Java Bean的属性中说明。

public aspect BalanceChangeSecurityAspect { private SecurityManager securityManager; public void setSecurityManager(SecurityManager securityManager) { this.securityManager = securityManager; } private pointcut balanceChanged() : set(int Account.balance); before() : balanceChanged() { this.securityManager.checkAuthorizedToModify(); } }

我们配置这个aspect的方式和普通类是一样的。注意,我们设置属性引用 的方式是完全相同的。注意,我们必须使用factory-method属性来指定使用 aspectOf()静态方法”创建”这个aspect。实际上,是定位(locating), 而非创建(creating)这个aspect,但Spring容器不关心这些。

<bean id="securityAspect" class="org.springframework.samples.aspectj.bank.BalanceChangeSecurityAspect" factory-method="aspectOf" > <property name="securityManager"> <ref local="securityManager"/> </property> </bean>

我们不需要在Spring配置中做任何事情去定位(target)这个aspect。 在这个aspect的控制适用地方的AspectJ代码里,包含了切入点(pointcut) 的信息。这样它甚至能够适用于不被Spring IoC容器管理的对象。

6.2.1.2. 排序问题

待完成

6.2.2. 非单例aspect

** 按每个目标完成资料,等等。(Complete material on per target etc)

6.2.3. 3.4 转向(Gotchas)

待完成

- 单例问题

6.3. 使用AspectJ切点定位Spring的建议

在Spring将来的版本中,我们计划支持在Spring XML或者其它的Bean定义 文件中使用AspectJ的切入点表达式来定位Spring通知(advice)。这将允许 AspectJ切入点模型的某些能力被应用在Spring基于代理的AOP框架。这将可以在 纯Java中工作,并且不需要AspectJ编译器。仅仅AspectJ切入点相关的方法调用的 子集是可用的。

这个特性计划在Spring 1.2版本中提供,它有赖于AspectJ的增强。

这个特性替代了我们先前为Spring创建一个切入点表达式语言的计划。

6.4. Spring提供给AspectJ的aspect

在将来的Spring版本中(可能是1.2),我们将加入一些Spring的服务作为 AspectJ的aspect,像声明性事务服务。这将允许AspectJ的用户使用这些服务, 而无需潜在地依赖于Spring的AOP框架,甚至,不必依赖Spring IoC容器。

AspectJ的用户可能比Spring用户对这个特性更感兴趣。

from: http://docs.huihoo.com/spring/zh-cn/aspectj.html

Spring - Java/J2EE Application Framework 应用框架 第 6 章 集成AspectJ相关推荐

  1. Spring - Java/J2EE Application Framework 应用框架 第 13 章 集成表现层

    第 13 章 集成表现层 13.1. 简介 Spring之所以出色的一个原因就是将表现层从MVC的框架中分离出来.例如,通过配置就可以让Velocity或者XSLT来代替已经存在的JSP页面.本章介绍 ...

  2. Spring - Java/J2EE Application Framework 应用框架 第 5 章 Spring AOP: Spring之面向方面编程G

    第 5 章 Spring AOP: Spring之面向方面编程 5.1. 概念 面向方面编程 (AOP) 提供从另一个角度来考虑程序结构以完善面向对象编程(OOP). 面向对象将应用程序分解成 各个层 ...

  3. Spring - Java/J2EE Application Framework 应用框架 第 5 章 Spring AOP: Spring之面向方面编程

    第 5 章 Spring AOP: Spring之面向方面编程 5.1. 概念 面向方面编程 (AOP) 提供从另一个角度来考虑程序结构以完善面向对象编程(OOP). 面向对象将应用程序分解成 各个层 ...

  4. Spring - Java/J2EE Application Framework 应用框架 第 12 章 Web框架

    第 12 章 Web框架 12.1. Web框架介绍 Spring的web框架是围绕分发器(DispatcherServlet)设计的,DispatcherServlet将请求分发到不同的处理器,框架 ...

  5. Spring - Java/J2EE Application Framework 应用框架 第 11 章 使用ORM工具进行数据访问

    第 11 章 使用ORM工具进行数据访问 11.1. 简介 Spring在资源管理,DAO实现支持以及实物策略等方面提供了与Hibernate, JDO和iBATIS SQL映射的集成. 对Hiber ...

  6. Spring - Java/J2EE Application Framework 应用框架 第 10 章 使用JDBC进行数据访问

    第 10 章 使用JDBC进行数据访问 10.1. 简介 Spring提供的JDBC抽象框架由core, datasource,object和support四个不同的包组成. 就和它名字的暗示一样,o ...

  7. Spring - Java/J2EE Application Framework 应用框架 第 8 章 源代码级的元数据支持

    第 8 章 源代码级的元数据支持 8.1. 源代码级的元数据 源代码级的元数据是对程序元素:通常为类和/或方法的 attribute 或者叫annotation的扩充. 举例来说,我们可以象下面一样给 ...

  8. Spring - Java/J2EE Application Framework 应用框架 第 7 章 事务管理

    第 7 章 事务管理 7.1. Spring事务抽象 Spring提供了一致的事务管理抽象.这个抽象是Spring最重要的抽象之一, 它有如下的优点: 为不同的事务API提供一致的编程模型,如JTA. ...

  9. Spring - Java/J2EE Application Framework 应用框架 第 14 章 JMS支持

    第 14 章 JMS支持 14.1. 介绍 Spring提供一个用于简化JMS API使用的抽象层框架,并且对用户屏蔽JMS API中从1.0.2到1.1版本之间的不同. JMS大体上被分为两个功能块 ...

最新文章

  1. VMware虚拟设备之虚拟磁盘配置与虚拟磁盘置备类型相关介绍
  2. 【基于libRTMP的流媒体直播之 AAC、H264 推送】
  3. rsyslogd 重启_ubuntu12.04 syslog记录正常与非正常关机重启
  4. JK_Rush关于索引的一些总结
  5. 形似棺材的“抗震救生床”,你会要吗?
  6. Xamarin 从零开始部署 iOS 上的 Walterlv.CloudKeyboard 应用
  7. c ++查找字符串_C ++数组| 查找输出程序| 套装5
  8. Linux内存分配机制之伙伴系统和SLAB
  9. 使用flask_socketio实现客户端间即时通信
  10. PHP解决方案@时间差异计算函数
  11. Docker 学习资料
  12. Spider局域网通讯软件
  13. python二维列表转字典_在Python中字符串、列表、元组、字典之间的相互转换
  14. UGUI的Button和Toggle
  15. 康托展开、康托逆展开原理
  16. 基于PCA降维实现人脸识别
  17. 两种方法解除网页复制限制
  18. html 图层嵌套特点,ps图层有哪几种类型?
  19. win 平台上排名第二的下载工具——IDM
  20. java爬虫模拟post请求_java爬虫之使用HttpClient模拟浏览器发送请求方法详解

热门文章

  1. Where Should an Architect Begin?--reference
  2. 深入redis内部--实现双向链表
  3. jquery学习手记(8)遍历
  4. 疫情之下信贷行业后续的前景
  5. Spring - @CompentScan全解
  6. Spring Cloud【Finchley】-04使用Ribbon实现客户端负载均衡
  7. ANDROID ASSET STUDIO
  8. html像素绘制文字,HTML5 - Canvas的使用样例10(绘制文本)
  9. php fetchassoc 跨表,php-mysqli_fetch_assoc-如果同时更改数据会怎样?
  10. 什么是html的编码方式,HTML网页中“&#19978;”是什么编码方式啊?网页中&# 爱问知识人...