目录 1
第1章 AOP简介 1
1.1 OOP把我们带到了何处 1
1.2 AOP如何解决OOP问题 7
1.2.1 什么是AOP 8
1.2.2 AOP的开发过程 8
1.3 结束语 9
第2章 实现AOP 10
2.1 AOP语言剖析 10
2.1.1 AOP语言规范 11
2.1.2 AOP语言的实现 13
2.2 AspectJ 14
2.3 结束语 15
第3章 Aspectj的获取和安装 16
3.1 Aspectj的要求 16
3.2 下载AspectJ 16
3.3 安装AspectJP 17
3.3.1 设置PATH 19
3.3.2 设置CLASSPATH 22
3.4 安装测试 22
3.5 结束语 24
第4章 实现AspectJ 25
4.1 我们的首个AsPectj程序 25
4.1.1 首先编写组件 26
4.1.2 aspect代码 27
4.1.3 识别连接点 27
4.1.4 确定poincut 28
4.1.5 提供advice 28
4.1.6 增加一个aspect 29
4.1.7 编译和执行这个例子 29
4.2 添加一个新的关注点 30
4.2.1 返回文本的方法 30
4.2.2 把返回方法记入日志 31
4.2.3 一个新的首要关注点 34
4.3 暴露的上下文 36
4.4 类型间声明 37
4.5 aspect粒度 39
4.6 AspectJ编译器功能 40
4.6.1 指定源目录 40
4.6.2 用JAR进行织入 41
4.6.3 指定输出到一个JAR文件 42
4.6.4 创建和使用aspect库 43
4.6.5 阻止织入 43
4.6.6 使用渐进式编译 43
4.7 结束语 44
第5章 AspectJ连接点 45
5.1 动态连接点模型 45
5.2 AspectJ连接点 49
5.3 连接点签名 51
5.4 模式 52
5.4.1 类型名称模式 53
5.4.2 子类型模式 55
5.4.3 抛出模式 55
5.4.4 类型模式 56
5.5 反射 57
5.5.1 thisJoinPoint方法 57
5.5.2 thisJoinPointStaticPart方法 59
5.6 连接点示例 60
5.6.1 方法调用接收和执行 60
5.6.2 构造函数的调用接收/执行以及对象初始化 63
5.6.3 字段获取/设置 64
5.6.4 异常处理程序执行 66
5.6.5 类初始化 66
5.7 结束语 67
第6章 AspectJ pointcut 68
6.1 三个类的介绍 68
6.2 建立pointcut 71
6.3.1 指示符快速参考 73
6.3 使用指示符 73
6.3.2 使用逻辑运算符来创建指示符组合 74
6.4 组合po intcut 74
6.4.1 方法相关的pointcut 75
6.4.2 异常处理指示符 79
6.4.3 与域有关的指示符 81
6.4.4 基于状态的指示符 84
6.4.5 基于控制流的指示符 95
6.4.6 类初始化指示符 103
6.4.7 基于程序文本的指示符 104
6.4.8 基于动态属性的指示符 107
6.4.9 adviceexecution 108
6.4.10 preinitialization 109
6.4.11 处理接口 109
6.4.12 匿名pointcut 110
6.4.14 创建Factory对象 111
6.4.13 在类中使用aspect 111
6.4.15 捕获Java库调用 113
6.4.16 访问final属性 114
6.4.17 异常模式 115
6.5 结束语 115
第7章 advice 116
7.1 advice的定义 116
7.1.1 将信息添加到Systerm.ut.println()中 116
7.1.2 advice 117
7.1.3 形式定义 120
7.2 所有类型advice中普遍存在的问题 121
7.2.1 将上下文导入advice中 121
7.2.2 advice与异常 128
7.3 advice的类型:概述 130
7.4 before advice 130
7.5 after advice 136
7.5.1 after advice(无限制型) 136
7.5.2 after抛出 139
7.5.3 after retuming 144
7.6 around advice 146
7.6.1 对getProperty()调用进行替换 147
7.6.2 proceed() 150
7.7 advice的优先级 159
7.7.1 优先级的重要性 159
7.7.2 优先级的决定方法 160
7.7.3 运行期执行 162
7.7.4 伪优先级 163
7.8 结束语 164
第8章 类型间声明 165
8.1 类型间声明的简单例子 166
8.1.1 向类中添加方法 166
8.1.2 引入和advice 173
8.2 类型间成员:机制 176
8.2.1 类型间成员的类型 176
8.2.2 类型间声明的目标 178
8.2.3 访问控制 180
8.2.4 成员间的冲突 181
8.3 declare parents 184
8.3.1 添加一个简单的接口 184
8.3.2 declare parents:机制 185
8.4 带有具体成员的接口 187
8.4.1 重构Persistence解决方案 188
8.4.2 带有具体成员的接口:机制 191
8.4.3 带有具体成员的接口的可能性 195
8.5 声明优先级 200
8.5.1 一个优先级的例子 200
8.5.2 声明优先级:机制 201
8.5.3 迂回问题 204
8.5.4 优先级的效果 204
8.6 其他静态横切 204
8.6.2 自定义编译消息 205
8.6.1 静态可确定的pointcut 205
8.6.3 软化异常 208
8.7 结束语 213
第9章 aspect 214
9.1 aspect结构 214
9.2 aspect扩展 218
9.2.1 构建抽象aspect 218
9.2.2 从类和接口中继承 223
9.3 aspect实例化和联合 224
9.3.1 单独的aspect 224
9.3.2 基于每对象的aspect 225
9.3.3 基于每控制流的aspect 227
9.4 aspect支配和优先级 228
9.5 访问aspect对象 229
9.6 aspect特权 230
9.7 结束语 232
10.1 采用AspectJ 233
第10章 ASpectJ的开发应用 233
10.1.1 采用AspectJ的缘由 234
10.1.2 如何将AspectJ应用到过程中 234
10.1.3 前期开发工作 235
10.1.4 取消AspectJ 235
10.2 开发使用 235
10.2.1 跟踪 235
10.2.2 条件检查 237
10.3 生产aspect 238
10.3.1 日志和计时 238
10.3.2 授权 240
10.4 结束语 241
第11章 使用ASpectJ工具 242
11.1 AspectJ编译器选项 242
11.2 aspect结构浏览器 243
11.3.1 JBuilder 247
11.3 使用AspectJ IDE扩展 247
11.3.2 Forte与NetBeans 253
11.3.3 Emacs 255
11.3.4 Eclipse 257
11.4 Ant 266
11.5 调试AspectJ 267
11.5.1 ajdb命令行指南 268
11.5.2 ajdb GUI指南 270
11.6 使用ajdoc 272
11.7 结束语 274
第12章 错误处理和一般问题 275
12.1 编译错误 275
12.1.1 错误的编译器 275
12.1.2 无法找到aspectjtoolsjar文件 276
12.1.3 内存溢出错误 277
12.1.4 错误的JSDK 277
12.2 扩展运行时错误处理 278
12.1.5 没有Java编译器 278
12.2.1 堆栈溢出 279
12.2.2 连接点不匹配 279
12.3 异常抛出与捕获 283
12.4 使用TraceJoinPointsjava 285
12.5 call指示符与execution指示符的区别 290
12.5.1 this()和target()的使用 291
12.5.2 within和withincode的效果 291
12.6 结束语 292
第13章 面向aspect例子:模式与重用 293
13.1 可重用持久性 293
13.1.1 PersistenceProtocol aspect 294
13.1.2 通过subaspect应用PersistenceProtocol 296
13.2 方法缓存 302
13.3 将模式标记为aspect 308
13.3.1 往aspect的API中添加无效特性 308
13.3.2 Observer模式 309
13.3.3 在AspectJ中重用Observer 310
13.4 面向方面的设计 319
13.5 结束语 320
第14章 ASpectJ在现实中的应用 321
14.1 添加特性 321
14.1.1 初始应用程序 321
14.1.2 待添加的特性 322
14.1.3 当前设计 322
14.1.4 软件的可继承性 324
14.1.5 编写aspect和源代码 324
14.1.6 测试 330
14.1.7 文档 330
14.1.8 结论 332
14.2 重构网络结构 333
14.2.1 logging 333
14.2.2 计时 347
14.2.3 检查点 348
14.3 结束语 350
附录A AspectJ API 351
A.1 接口层次关系 351
A.2 类层次关系 351
A.3 AspectJ API说明 351
A.3.1 接口:JoinPoint 352
A.3.2 接口:JoinPointStaticPart 355
A.3.3 接口:Signature 355
A.3.4 接口:CatchClauseSignature 357
A.3.5 接口:MemberSignature 358
A.3.6 接口:CodeSignature 358
A.3.7 接口:AdviceSignature 358
A.3.8 接口:InitializerSignature 359
A.3.9 接口:MethodSignature 359
A.3.10 接口:FieldSignature 360
A.3.11 接口:SourceLocation 360
A.3.12 类:SoftException 361
A.3.13 类:NoAspectBoundException 362
附录B 有帮助的Web站点 363
B.1 概述性站点 363
B.2 人物 363
B.3 自然教程 363
B.4 论文 364
B.6 软件开发和系统 365
B.7 事件 365
B.5 其他范例 365
B.8 大学 366
附录C 其他AOP语言绑定 367
C.1 AspectR 367
C.1.1 说明 367
C.1.2 要求 367
C.1.3 例子代码 367
C.3.1 说明 368
C.3 Apostle 368
C.2.1 说明 368
C.2.2 要求 368
C.2 AspectS 368
C.3.2 要求 369
C.4 AspectC 369
C.4.1 说明 369
C.4.2 要求 369
C.4.3 例子代码 369
C.5 AspectC++ 370
C.5.1 说明 370
C.5.2 要求 370
C.5.3 例子代码 370
C.6 Pythius 371
C.6.1 说明 371
C.6.2 要求 371
C.6.3 例子代码 371