﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Allan-随笔分类-AOP</title><link>http://www.blogjava.net/Allan/category/16859.html</link><description>I choose, I like!</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 03:56:54 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 03:56:54 GMT</pubDate><ttl>60</ttl><item><title>AOP简介</title><link>http://www.blogjava.net/Allan/archive/2005/12/06/22758.html</link><dc:creator>Allon</dc:creator><author>Allon</author><pubDate>Tue, 06 Dec 2005 11:23:00 GMT</pubDate><guid>http://www.blogjava.net/Allan/archive/2005/12/06/22758.html</guid><wfw:comment>http://www.blogjava.net/Allan/comments/22758.html</wfw:comment><comments>http://www.blogjava.net/Allan/archive/2005/12/06/22758.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Allan/comments/commentRss/22758.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Allan/services/trackbacks/22758.html</trackback:ping><description><![CDATA[<P style="MARGIN: 0in; mso-outline-level: 1"><SPAN lang=EN-US style="FONT-SIZE: 10pt; FONT-FAMILY: Verdana"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN></SPAN><FONT size=2><SPAN lang=ZH-CN style="FONT-SIZE: 10.5pt; FONT-FAMILY: SimSun">虽然AOP目前还不是如OOP般非常成熟，但是，也已经有数个支持AOP的产品问世，其中比较有名的有</SPAN><SPAN lang=ZH-CN style="FONT-SIZE: 10.5pt; COLOR: red; FONT-FAMILY: SimSun">AspectJ</SPAN><SPAN lang=ZH-CN style="FONT-SIZE: 10.5pt; FONT-FAMILY: SimSun">，</SPAN><SPAN lang=ZH-CN style="FONT-SIZE: 10.5pt; COLOR: red; FONT-FAMILY: SimSun">AspectWerkz</SPAN><SPAN lang=ZH-CN style="FONT-SIZE: 10.5pt; FONT-FAMILY: SimSun">等，这些产品都基于Java平台。在.Net平台上，也有一些实现，如</SPAN><SPAN lang=ZH-CN style="FONT-SIZE: 10.5pt; COLOR: red; FONT-FAMILY: SimSun">LOOM</SPAN><SPAN lang=ZH-CN style="FONT-SIZE: 10.5pt; FONT-FAMILY: SimSun">等，但是，相对于Java平台的实现，这些实现都还很不成熟，功能也比较弱，使用上也不是很方便。</SPAN></FONT></P>
<P style="FONT-WEIGHT: bold; FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2></FONT>&nbsp;</P>
<P style="FONT-WEIGHT: bold; FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>AOP应用范围</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　很明显，AOP非常适合开发J2EE容器服务器，目前JBoss 4.0正是使用AOP框架进行开发。</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　具体功能如下：</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: SimSun; mso-outline-level: 2"><FONT size=2>Authentication 权限</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: SimSun; mso-outline-level: 2"><FONT size=2>Caching 缓存</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: SimSun; mso-outline-level: 2"><FONT size=2>Context passing 内容传递</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: SimSun; mso-outline-level: 2"><FONT size=2>Error handling 错误处理</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: SimSun; mso-outline-level: 2"><FONT size=2>Lazy loading　懒加载</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: SimSun; mso-outline-level: 2"><FONT size=2>Debugging　　调试</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: SimSun; mso-outline-level: 2"><FONT size=2>logging, tracing, profiling and monitoring　记录跟踪　优化　校准</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: SimSun; mso-outline-level: 2"><FONT size=2>Performance optimization　性能优化</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: SimSun; mso-outline-level: 2"><FONT size=2>Persistence　　持久化</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: SimSun; mso-outline-level: 2"><FONT size=2>Resource pooling　资源池</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: SimSun; mso-outline-level: 2"><FONT size=2>Synchronization　同步</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in 0in 0in 0.5in; FONT-FAMILY: SimSun; mso-outline-level: 2"><FONT size=2>Transactions 事务</FONT></P>
<P style="FONT-WEIGHT: bold; FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>AOP有必要吗？</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　当然，上述应用范例在没有使用AOP情况下，也得到了解决，例如JBoss 3.XXX也提供了上述应用功能，但是没有使用AOP。</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　但是，使用AOP可以让我们从一个更高的抽象概念来理解软件系统，AOP也许提供一种有价值的工具。可以这么说：因为使用AOP结构，现在JBoss 4.0的源码要比JBoss 3.X容易理解多了，这对于一个大型复杂系统来说是非常重要的。</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　从另外一个方面说，好像不是所有的人都需要关心AOP，它可能是一种架构设计的选择，如果选择J2EE系统，AOP关注的上述通用方面都已经被J2EE容器实现了，J2EE应用系统开发者可能需要更多地关注行业应用方面aspect。</FONT></P>
<P style="FONT-WEIGHT: bold; FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>AOP具体实现</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　AOP是一个概念，并没有设定具体语言的实现，它能克服那些只有单继承特性语言的缺点（如Java），目前AOP具体实现有以下几个项目：</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　AspectJ (TM)：　创建于Xerox PARC. 有近十年历史，成熟</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　缺点：过于复杂；破坏封装；需要专门的Java编译器。</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　动态AOP：使用JDK的动态代理API或字节码Bytecode处理技术。</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　基于动态代理API的具体项目有：</FONT></P>
<P style="MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><A href="http://www.jboss.org/index.html?module=html&amp;op=userdisplay&amp;id=developers/pro"><SPAN style="FONT-SIZE: 10.5pt; COLOR: blue"><FONT size=2>　　JBoss 4.0</FONT></SPAN></A><SPAN style="FONT-SIZE: 10.5pt"><FONT size=2> JBoss 4.0服务器</FONT></SPAN></P>
<P style="MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><A href="http://nanning.sourceforge.net/"><SPAN style="FONT-SIZE: 10.5pt; COLOR: blue"><FONT size=2>　　nanning</FONT></SPAN></A><SPAN style="FONT-SIZE: 10.5pt"><FONT size=2>　这是以中国南宁命名的一个项目，搞不清楚为什么和中国相关？是中国人发起的？</FONT></SPAN></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　基于字节码的项目有：</FONT></P>
<P style="MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><A href="http://aspectwerkz.codehaus.org/"><SPAN style="FONT-SIZE: 10.5pt; COLOR: blue"><FONT size=2>　　aspectwerkz</FONT></SPAN></A><SPAN style="FONT-SIZE: 10.5pt"><FONT size=2>　</FONT></SPAN></P>
<P style="MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><A href="http://springframework.org/"><SPAN style="FONT-SIZE: 10.5pt; COLOR: blue"><FONT size=2>　　spring　？</FONT></SPAN></A></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2></FONT>&nbsp;</P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; mso-outline-level: 1"><FONT size=2><SPAN lang=EN-US style="FONT-FAMILY: Verdana"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: SimSun">多个访问类同时访问一个共享数据对象时，每个访问类在访问这个数据对象时，需要将数据对象上锁，访问完成后，再实行解锁，供其它并发线程访问，这是我们处理并发访问资源的方式。</SPAN></FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2></FONT>&nbsp;</P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; mso-outline-level: 1"><FONT size=2><SPAN lang=EN-US style="FONT-FAMILY: Verdana"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=ZH-CN style="FONT-FAMILY: SimSun">为了实现这个需求，先实现传统的编程，这里我们假定有一个写锁，对数据对象实行写之前，首先对这个对象进行上写锁，写操作完毕后，必须释放写锁。</SPAN></FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　首先，我们需要一个锁，这个锁可以是数据对象中一个字段或其它，这里使用</FONT><A href="http://gee.cs.oswego.edu/dl/"><SPAN style="COLOR: blue"><FONT size=2>Doug Le</FONT></SPAN></A><FONT size=2>a的</FONT><A href="http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/ReentrantWriterPreferenceReadWriteLock.html"><SPAN style="COLOR: blue"><FONT size=2>ReentrantWriterPreferenceReadWriteLock</FONT></SPAN></A><FONT size=2>作为我们的锁资源。</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>import EDU.oswego.cs.dl.util.concurrent.*;</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>public class Worker extends Thread {</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　Data data;</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　ReentrantWriterPreferenceReadWriteLock rwl =　</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　　new ReentrantWriterPreferenceReadWriteLock(); </FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　public boolean createData() {</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　try {</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　　rwl.writeLock().acquire();　//上锁</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　　//对data实行写逻辑操作　</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　　　　　 </FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　}catch() {</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　 return false;</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　}finally{</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　 rwl.writeLock().release(); 　//解锁</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　}</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　return true;</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　}</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　public boolean updateData() {</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　try {</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　　rwl.writeLock().acquire();//上锁</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　　//对data实行写逻辑操作　</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　　　　　 </FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　}catch() {</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　 return false;</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　}finally{</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　 rwl.writeLock().release(); //解锁</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　}</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　return true;</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　}</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　public void run() {</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　　//执行createData()或updateData()</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　}</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>}</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>假设可能存在另外一个访问类，也将对数据对象实现写操作，代码如下：</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>import EDU.oswego.cs.dl.util.concurrent.*;</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>public class AnotherWorker extends Thread {</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　Data data;</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　ReentrantWriterPreferenceReadWriteLock rwl =　</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　　new ReentrantWriterPreferenceReadWriteLock(); </FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　public boolean updateData() {</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　try {</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　　rwl.writeLock().acquire();//上锁</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　　//对data实行写逻辑操作　</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　　　　　 </FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　}catch() {</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　 return false;</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　}finally{</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　 rwl.writeLock().release(); //解锁</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　}</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　return true;</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　}</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　public void run() {</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　　//执行updateData()</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　}</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>}</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　以上是Java传统编程的实现，这种锁的实现方式是在每个具体类中实现。<BR>&nbsp;&nbsp;&nbsp; </FONT><FONT size=2>这种实现方式的缺点很多：</FONT></P>
<UL style="MARGIN-TOP: 0in; MARGIN-BOTTOM: 0in; MARGIN-LEFT: 1in; DIRECTION: ltr; unicode-bidi: embed" type=disc>
<LI style="MARGIN-TOP: 0px; FONT-SIZE: 10pt; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle; mso-outline-level: 2"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: SimSun"><FONT size=2>冗余：有很多重复的编码，如rwl.writeLock().acquire()等； </FONT></SPAN>
<LI style="MARGIN-TOP: 0px; FONT-SIZE: 10pt; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle; mso-outline-level: 2"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: SimSun"><FONT size=2>减少重用：worker的updateData()方法重用性几乎为零。 </FONT></SPAN>
<LI style="MARGIN-TOP: 0px; FONT-SIZE: 10pt; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle; mso-outline-level: 2"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: SimSun"><FONT size=2>"数据对象写操作必须使用锁控制这个设计目的"不容易显现，如果更换了一个新的程序员，他可能编写一段不使用锁机制就对这个数据对象写操作的代码。 </FONT></SPAN>
<LI style="MARGIN-TOP: 0px; FONT-SIZE: 10pt; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle; mso-outline-level: 2"><SPAN style="FONT-SIZE: 10.5pt; COLOR: black; FONT-FAMILY: SimSun"><FONT size=2>如果上述代码有读功能，那么我们需要在代码中实现先上读锁，当需要写时，解读锁，再上写锁等等，如果稍微不小心，上锁解锁次序搞错，系统就隐含大的BUG，这种可能性会随着这个数据对象永远存在下去，系统设计大大的隐患啊！ </FONT></SPAN></LI></UL>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　那么我们使用AOP概念来重新实现上述需求，AOP并没有什么新花招，只是提供了观察问题的一个新视角度。</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　这里我们可以抛开新技术迷人雾障，真正核心还是新思维、新视点，人类很多问题如果换一个脑筋看待理解，也许结果真的是翻天覆地不一样啊，所以，作为人自身，首先要重视和你世界观和思维方式不一样的人进行交流和沟通。</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　现实生活中有很多"不公平"，例如某个小学毕业生成了千万富翁，你就怀疑知识无用，也许你认为他的机会好，其实你可能不知道，他的观察问题的视角比你独特，或者他可能会经常换不同的角度来看待问题和解决问题，而你由于过分陷入一个视角的具体实现细节中，迷失了真正的方向，要不说是读书人脑子僵化呢？</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　言归正传，我们看看AOP是如何从一个新的视角解决上述问题的。</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　如果说上面代码在每个类中实现上锁或解锁，类似横向解决方式，那么AOP是从纵向方面来解决上述问题。<BR></FONT><FONT size=2><BR>　　AOP把这个<SPAN style="COLOR: red">纵向切面cross-cuts</SPAN>称为<SPAN style="COLOR: red">Aspect（方面）</SPAN>，其实我认为AOP翻译成<SPAN style="FONT-WEIGHT: bold; COLOR: red">面向切面编程</SPAN>比较好，不知哪个糊涂者因为先行一步，翻译成“面向方面编程”如此抽象，故弄玄虚。</FONT></P>
<P style="FONT-WEIGHT: bold; FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>AspectJ实现</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　下面我们使用AOP的实现之一AspectJ来对上述需求改写。AspectJ是AOP最早成熟的Java实现，它稍微扩展了一下Java语言，增加了一些Keyword等，pointcut的语法如下：</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>public pointcut 方法名：call(XXXX)</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　AspectJ增加了pointcut, call是pointcut类型，有关AspectJ更多基本语法见</FONT><A href="http://today.java.net/pub/a/today/2003/12/26/ch3AspectJSyntaxBasics.html"><SPAN style="COLOR: blue"><FONT size=2>这里</FONT></SPAN></A><FONT size=2>。因为AspectJ使用了一些特别语法，所以Java编译器就不能用SUN公司提供javac了，必须使用其专门的编译器，也许SUN在以后JDK版本中会引入AOP。</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　使用AspectJ如何实现上图所谓切面式的编程呢？首先,我们将上图纵向切面称为Aspect，那么我们建立一个类似Class的Aspect，Java中建立一个Class代码如下：</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>public class MyClass{</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　//属性和方法 ...</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>}</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　同样，建立一个Aspect的代码如下：</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>public aspect MyAspect{</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　//属性和方法 ...</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>}</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>建立一个Aspect名为Lock，代码如下：</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>import EDU.oswego.cs.dl.util.concurrent.*;</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>public aspect Lock {</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　......</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　ReentrantWriterPreferenceReadWriteLock rwl =　</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　　new ReentrantWriterPreferenceReadWriteLock(); </FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　public <SPAN style="FONT-WEIGHT: bold; COLOR: red">pointcut</SPAN><SPAN style="COLOR: red"> </SPAN><SPAN style="COLOR: blue">writeOperations</SPAN>(): </FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　　execution(<SPAN style="COLOR: red">public boolean Worker.createData()</SPAN>) ||</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　　execution(<SPAN style="COLOR: red">public boolean Worker.updateData()</SPAN>) ||</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　　execution(<SPAN style="COLOR: red">public boolean AnotherWorker.updateData()</SPAN>) ;</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　<SPAN style="FONT-WEIGHT: bold">before</SPAN>() : <SPAN style="COLOR: blue">writeOperations</SPAN>() { </FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　　rwl.writeLock().acquire();//上锁　advice body</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　}</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　<SPAN style="FONT-WEIGHT: bold">after</SPAN>() : <SPAN style="COLOR: blue">writeOperations</SPAN>() {</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　 rwl.writeLock().release(); //解锁 advice body</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　}</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　......</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>}</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　上述代码关键点是pointcut，意味切入点或触发点，那么在那些条件下该点会触发呢？是后面红字标识的一些情况，在执行Worker的createData()方法，Worker的update方法等时触发。</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　before代表触发之前做什么事情？</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　答案是上锁。 </FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　after代表触发之后做什么事情？</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　答案是上锁。 </FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　通过引入上述aspect，那么Worker代码可以清洁如下：</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>public class Worker extends Thread {</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　Data data;</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　public boolean <SPAN style="COLOR: red">createData</SPAN>() {</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　try {</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　　//对data实行写逻辑操作　　　　　　　　 </FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　}catch() {</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　 return false;</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　}</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　return true;</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　}</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　public boolean <SPAN style="COLOR: red">updateData</SPAN>() {</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　try {</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　　//对data实行写逻辑操作　　　　　　　　 </FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　}catch() {</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　 return false;</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　}finally{</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　}</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　return true;</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　}</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　public void run() {</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　　//执行createData()或updateData()</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　}</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>}</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　Worker中关于“锁”的代码都不见了，纯粹变成了数据操作的主要方法。</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2></FONT>&nbsp;</P>
<P style="FONT-WEIGHT: bold; FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>AOP术语</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　通过上例已经知道AspectJ如何从切面crosscutting来解决并发访问应用需求的，其中最重要的是引入了一套类似事件触发机制。</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　<SPAN style="COLOR: red">Pointcut类似触发器，是事件Event发生源</SPAN>，一旦pointcut被触发，将会产生相应的动作Action，这部分Action称为<SPAN style="COLOR: red">Advice</SPAN>。</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　Advice在AspectJ有三种：before、 after、Around之分，上述aspect Lock代码中使用了Advice的两种before和after。</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　所以<SPAN style="COLOR: red">AOP有两个基本的术语</SPAN>：<SPAN style="COLOR: red">Pointcut</SPAN>和<SPAN style="COLOR: red">Advice</SPAN>。你可以用事件机制的Event和Action来类比理解它们。<BR><BR></FONT><FONT size=2>小结如下：</FONT></P>
<P style="MARGIN: 0in; mso-outline-level: 1"><FONT size=2><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: red; FONT-FAMILY: SimSun">Advice</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: red; FONT-FAMILY: Verdana">(</SPAN><SPAN lang=ZH-CN style="FONT-SIZE: 10pt; COLOR: red; FONT-FAMILY: SimSun">增强</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: red; FONT-FAMILY: Verdana">)</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: red; FONT-FAMILY: SimSun"> </SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: SimSun">- </SPAN><SPAN lang=ZH-CN style="FONT-SIZE: 10.5pt; FONT-FAMILY: SimSun">真正的执行代码，或者说关注的实现。 类似Action。</SPAN></FONT></P>
<P style="MARGIN: 0in; mso-outline-level: 1"><FONT size=2><SPAN lang=ZH-CN style="FONT-SIZE: 10.5pt; COLOR: red; FONT-FAMILY: SimSun">join point</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: red; FONT-FAMILY: Verdana">(</SPAN><SPAN lang=ZH-CN style="FONT-SIZE: 10pt; COLOR: red; FONT-FAMILY: SimSun">连接点</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: red; FONT-FAMILY: Verdana">)</SPAN><SPAN lang=ZH-CN style="FONT-SIZE: 10.5pt; FONT-FAMILY: SimSun"> - 代码中激活advice被执行的触发点。</SPAN></FONT></P>
<P style="MARGIN: 0in; mso-outline-level: 1"><FONT size=2><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: red; FONT-FAMILY: SimSun">Pointcut</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: red; FONT-FAMILY: Verdana">(</SPAN><SPAN lang=ZH-CN style="FONT-SIZE: 10pt; COLOR: red; FONT-FAMILY: SimSun">切入点</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: red; FONT-FAMILY: Verdana">)</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: red; FONT-FAMILY: SimSun"> </SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: SimSun">- </SPAN><SPAN lang=ZH-CN style="FONT-SIZE: 10.5pt; FONT-FAMILY: SimSun">一系列的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: SimSun">j</SPAN><SPAN lang=ZH-CN style="FONT-SIZE: 10.5pt; FONT-FAMILY: SimSun">oin point称为pointcut，pointcut有时代指join point</SPAN></FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>其中advice部分又有：</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2><SPAN style="COLOR: red">Interceptor </SPAN>- 解释器并没有在AspectJ出现，在使用JDK动态代理API实现的AOP框架中使用，解释有方法调用或对象构造或者字段访问等事件，是调用者和被调用者之间的纽带，综合了Decorator/代理模式甚至职责链等模式。</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2><SPAN style="COLOR: red">Introduction </SPAN>- 修改一个类，以增加字段、方法或构造或者执行新的接口，包括Mixin实现。</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>例如上述并发访问应用中，如果想为每个Data对象生成相应的aspect Lock，那么可以在aspect Lock中人为数据对象增加一个字段lock，如下：</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>aspect Lock {</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　Data sharedDataInstance;</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　Lock( Data d ) {</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　　 sharedDataInstance = d;</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　}</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　introduce Lock Data.lock;　//修改Data类，增加一字段lock</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　advise Data() { //Data构造时触发</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　　 static after {</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　　　　 //当Data对象生成时，将Data中lock字段赋值为aspect Lock</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　　　　 //为每个Data对象生成相应的aspect Lock</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　　　　 thisObject.lock = new Lock( thisObject );</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　　　 }</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　 }</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　....</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>}</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>上述代码等于在Data类中加入一行：</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>public class Data{</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　......</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　Lock lock = new Lock();</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>　　...... </FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>}</FONT></P>
<P style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1">&nbsp;</P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2>还有其它两个涉及AOP代码运行方式：</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2><SPAN style="COLOR: red">weaving </SPAN>- 将aspect代码插入到相应代码中的过程，一般是编译完成或在运行时动态完成。取决于具体AOP产品，例如AspectJ是使用特殊编译器在编译完成weaving，而nanning、JBoss AOP是使用动态代理API，因此在运行时动态完成weaving的。</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2><SPAN style="COLOR: red">instrumentor </SPAN>- 用来实现weaving功能的工具。</FONT></P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2></FONT>&nbsp;</P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2></FONT>&nbsp;</P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2></FONT>&nbsp;</P>
<P style="FONT-SIZE: 10.5pt; MARGIN: 0in; FONT-FAMILY: SimSun; mso-outline-level: 1"><FONT size=2></FONT>&nbsp;</P>
<P lang=EN-US style="FONT-WEIGHT: bold; FONT-SIZE: 11.25pt; MARGIN: 0in; COLOR: black; FONT-FAMILY: arial; mso-outline-level: 1"><FONT size=2>结束语</FONT></P>
<P lang=EN-US style="FONT-SIZE: 11pt; MARGIN: 0in; mso-outline-level: 1"><FONT size=2><SPAN style="COLOR: black; FONT-FAMILY: Verdana"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体">AOP 与面向对象的设计和编程并不抵触，也不会代替它，相反，它是一种</SPAN><SPAN style="COLOR: red; FONT-FAMILY: 宋体">补充技术</SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体">。横切关注点使代码污染出现于多个模块化单位之中，它干扰了核心业务逻辑，并产生了纠缠的、难于维护的和脆弱的代码。现有的编程语言和设计方法没有干净地分离横切关注点的机制。通过用切入点选择连接点，可以控制在什么时候和什么地方执行横切代码。用通知指定连接点匹配时执行的代码。类型间声明使您可以在现有类中加入新字段和方法作为方面的一部分。</SPAN></FONT></P><img src ="http://www.blogjava.net/Allan/aggbug/22758.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Allan/" target="_blank">Allon</a> 2005-12-06 19:23 <a href="http://www.blogjava.net/Allan/archive/2005/12/06/22758.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>