﻿<?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-逆水深寒-随笔分类-j2ee</title><link>http://www.blogjava.net/cjwang-21/category/40983.html</link><description>我是一只弱小的毛毛虫，想像有一天可以成为强壮的挖土机，
拥有挖掘梦想的神奇手套。。。</description><language>zh-cn</language><lastBuildDate>Wed, 22 Jul 2009 15:20:12 GMT</lastBuildDate><pubDate>Wed, 22 Jul 2009 15:20:12 GMT</pubDate><ttl>60</ttl><item><title>spring的aop用法个人使用总结</title><link>http://www.blogjava.net/cjwang-21/archive/2009/07/22/287925.html</link><dc:creator>逆水深寒</dc:creator><author>逆水深寒</author><pubDate>Wed, 22 Jul 2009 14:39:00 GMT</pubDate><guid>http://www.blogjava.net/cjwang-21/archive/2009/07/22/287925.html</guid><wfw:comment>http://www.blogjava.net/cjwang-21/comments/287925.html</wfw:comment><comments>http://www.blogjava.net/cjwang-21/archive/2009/07/22/287925.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cjwang-21/comments/commentRss/287925.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cjwang-21/services/trackbacks/287925.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 前些日子西安项目中的任务日志，以及最近参与工作流动态表单开发中都使用到了spring的aop。所以，自己简单的进行了一下总结，也算是对前一段时间工作的一个总结吧。<br />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5Cwang%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:Calibri;
mso-bidi-font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";}
</style>
<![endif]-->
<p style="text-indent: 15.75pt;">&nbsp;AOP<span style="font-family: 宋体;">（</span><span>Aspect-Oriented
Programming</span><span style="font-family: 宋体;">，面向切面编程），可以说是</span>OOP<span style="font-family: 宋体;">（</span><span style="font-family: 宋体;">面向对象编程）的补充和完善。</span>OOP<span style="font-family: 宋体;">引入封装、继承和多态性等概念来建立一种对象层次结构，用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候，</span>OOP<span style="font-family: 宋体;">则显得无能为力。也就是说，</span>OOP<span style="font-family: 宋体;">允许你定义从上到下的关系，但并不适合定义从左到右的关系。例如日志功能。日志代码往往水平地散布在所有对象层次中，而与它所散布到的对象的核心功能毫无关系。对于其他类型的代码，如安全性、异常处理和透明的持续性也是如此。这种散布在各处的无关的代码被称为横切（</span>cross-cutting<span style="font-family: 宋体;">）代码，在</span>OOP<span style="font-family: 宋体;">设计中，它导致了大量代码的重复，而不利于各个模块的重用。</span></p>
<p style="text-indent: 15.75pt;"><span style="font-family: 宋体;">&nbsp;而</span>AOP<span style="font-family: 宋体;">技术则恰恰相反，它利用一种称为&#8220;横切&#8221;的技术，剖解开封装的对象内部，并将那些影响了多个类的公共行为封装到一个可重用模块，并将其名为&#8220;</span>Aspect<span style="font-family: 宋体;">&#8221;，即方面。所谓&#8220;方面&#8221;，简单地说，就是将那些与业务无关，却为业务模块所共同调用的逻辑或责任封装起来，便于减少系统的重复代码，降低模块间的耦合度，并有利于未来的可操作性和可维护性。</span>AOP<span style="font-family: 宋体;">代表的是一个横向的关系，如果说&#8220;对象&#8221;是一个空心的圆柱体，其中封装的是对象的属性和行为；那么面向方面编程的方法，就仿佛一把利刃，将这些空心圆柱体剖开，以获得其内部的消息。而剖开的切面，也就是所谓的&#8220;方面&#8221;了。然后它又以巧夺天功的妙手将这些剖开的切面复原，不留痕迹。</span></p>
<p style="text-indent: 15.75pt;">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 11" />
<meta name="Originator" content="Microsoft Word 11" />
<link rel="File-List" href="file:///C:%5CDOCUME%7E1%5Cwang%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:Calibri;
mso-bidi-font-family:"Times New Roman";}
span.hilite1
{
font-family:"Times New Roman";
mso-bidi-font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.0pt;
font-family:"Times New Roman";
mso-fareast-font-family:"Times New Roman";}
</style>
<![endif]-->
</p>
<p><span style="font-family: Calibri;">&nbsp;&nbsp;&nbsp; Spring</span><span style="font-family: 宋体;">支持四种拦截类型：目标方法调用前（</span>before<span style="font-family: 宋体;">），目标方法调用后（</span>after<span style="font-family: 宋体;">），目标方法调用前后（</span>around<span style="font-family: 宋体;">），以及目标方法抛出异常（</span>throw<span style="font-family: 宋体;">）。</span></p>
<p><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp; 前置拦截的类必须实现</span>MethodBeforeAdvice<span style="font-family: 宋体;">接口，实现其中的</span>before<span style="font-family: 宋体;">方法。</span></p>
<p><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp; 后置拦截的类必须实现</span>AfterReturningAdvice<span style="font-family: 宋体;">接口，实现其中的</span>afterReturning<span style="font-family: 宋体;">方法。</span></p>
<p><span style="font-family: 宋体;">&nbsp;&nbsp;&nbsp; 环绕拦截的类必须实现</span>MethodInterceptor<span style="font-family: 宋体;">接口，实现其中的</span>invoke<span style="font-family: 宋体;">方法。环绕拦截是唯一可以控制目标方法是否被真正调用的拦截类型，也可以控制返回对象。而前置拦截或后置拦截不能控制，它们不能印象目标方法的调用和返回。</span><span><br />
</span><span style="font-family: 宋体;">但是以上的拦截的问题在于，不能对于特定方法进行拦截，而只能对某个类的全部方法作拦截。所以下面引入了两个新概念：</span>&#8220;<span style="font-family: 宋体;">切入点</span>&#8221;<span style="font-family: 宋体;">和</span>&#8220;<span style="font-family: 宋体;">引入通知</span>&#8221;<span style="font-family: 宋体;">。</span></p>
<p style="text-indent: 21pt;">&#8221;<span style="font-family: 宋体;">切入点</span>&#8220;<span style="font-family: 宋体;">的定义相当于更加细化地规定了哪些方法被哪些拦截器所拦截，而并非所有的方法都被所有的拦截器所拦截。在</span>ProxyFactoryBean<span style="font-family: 宋体;">的属性中，</span>interceptorNames<span style="font-family: 宋体;">属性的对象也由拦截（</span>Advice<span style="font-family: 宋体;">）变成了引入通知（</span>Advisor<span style="font-family: 宋体;">），正是在</span>Advisor<span style="font-family: 宋体;">中详细定义了切入点（</span>PointCut<span style="font-family: 宋体;">）和拦截（</span>Advice<span style="font-family: 宋体;">）的对应关系，比如常见的基于名字的切入点匹配（</span>NameMatchMethodPointcutAdvisor<span style="font-family: 宋体;">类）和基于正则表达式的切入点匹配（</span>RegExpPointcutAdvisor<span style="font-family: 宋体;">类）。这些切入点都属于</span>&#8221;<span style="font-family: 宋体;">静态切入点</span>&#8220;<span style="font-family: 宋体;">，因为他们只在代理创建的时候被创建一次，而不是每次运行都创建。</span></p>
<p style="text-indent: 21pt;"><span style="font-family: 宋体;">下面是spring的配置文件 当然aop的配置方式有许多种，这只是其中一种<br />
</span></p>
<p>&nbsp;</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">&nbsp;获取相应的instance对象&nbsp;并且不被aop拦截&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">bean&nbsp;id</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">oaTaskInstanceService4Log</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;parent</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">transactionProxy</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">target</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">bean<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">com.oa.task.service.impl.OaTaskInstanceServiceImpl</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">oaTaskInstanceDao</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">ref&nbsp;local</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">oaTaskInstanceDao</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">bean</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">bean</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">&nbsp;instance日志所需DAO&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">bean&nbsp;id</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">oaTaskInstanceLogDao</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">com.oa.task.dao.OaTaskInstanceLogDao</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">sessionFactory</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;ref</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">sessionFactory</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">bean</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">&nbsp;instance日志所需Service&nbsp; 此接口为 日志的业务操作接口</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">bean&nbsp;id</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">oaTaskInstanceLogService</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;parent</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">transactionProxy</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">target</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">bean<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">com.oa.task.service.impl.OaTaskInstanceLogServiceImpl</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">oaTaskInstanceLogDao</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">ref&nbsp;local</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">oaTaskInstanceLogDao</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">sysOperDao</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">ref&nbsp;bean</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">sysOperDao</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">ibatisBase</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">ref&nbsp;bean</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">ibatisBase</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">bean</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">bean</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">&nbsp;instance日志AOP拦截类&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">bean&nbsp;id</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">oaTaskInstanceLogOper</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">com.oa.task.log.OaTaskInstanceLogOper</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">oaTaskInstanceLogService</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">ref&nbsp;local</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">oaTaskInstanceLogService</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">oaTaskInstanceService</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">ref&nbsp;local</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">oaTaskInstanceService4Log</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">bean</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">&nbsp;instance日志AOP配置绑定&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">bean&nbsp;id</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">oaTaskInstanceLogAutoProxy</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">beanNames</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">list</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">value</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">oaTaskInstanceService</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">value</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp; //拦截的业务接口 </span><span style="color: #000000;">oaTaskInstanceService内所有方法都进行拦截</span><br />
<span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">list</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">interceptorNames</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">list</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">value</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">oaTaskInstanceLogOper</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">value</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp; //拦截器<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">list</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">bean</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span></div>
&nbsp;&nbsp;
下面是 拦截器<span style="color: #000000;">oaTaskInstanceLogOper类，采用的是环绕拦截的方式。<br />
</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;OaTaskInstanceLogOper&nbsp;&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;MethodInterceptor{<br />
</span><span style="color: #008000;">&nbsp;&nbsp;&nbsp; /**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;当更新动作发生时的记录<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Object&nbsp;invoke(MethodInvocation&nbsp;invocation)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Throwable&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;method&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;invocation.getMethod().getName();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;result&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(MODIFY_INSTANCE.equals(method)){</span><span style="color: #008000;">//</span><span style="color: #008000;">修改日志</span><span style="color: #008000;">（业务逻辑 判断方法）<br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;">......//</span><span style="color: #008000;">业务操作，进行日志的记录</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result</span><span style="color: #000000;">=</span><span style="color: #000000;">invocation.proceed();&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;{</span><span style="color: #008000;">//</span><span style="color: #008000;">不做任何日志</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result</span><span style="color: #000000;">=</span><span style="color: #000000;">invocation.proceed();//调用原来的方法 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;result;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
<br />
}<br />
</span></div>
<br />
<p style="text-indent: 15.75pt;">
</p>
<br />
<img src ="http://www.blogjava.net/cjwang-21/aggbug/287925.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cjwang-21/" target="_blank">逆水深寒</a> 2009-07-22 22:39 <a href="http://www.blogjava.net/cjwang-21/archive/2009/07/22/287925.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2.0几种标签用法</title><link>http://www.blogjava.net/cjwang-21/archive/2009/07/21/287642.html</link><dc:creator>逆水深寒</dc:creator><author>逆水深寒</author><pubDate>Tue, 21 Jul 2009 06:21:00 GMT</pubDate><guid>http://www.blogjava.net/cjwang-21/archive/2009/07/21/287642.html</guid><wfw:comment>http://www.blogjava.net/cjwang-21/comments/287642.html</wfw:comment><comments>http://www.blogjava.net/cjwang-21/archive/2009/07/21/287642.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cjwang-21/comments/commentRss/287642.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cjwang-21/services/trackbacks/287642.html</trackback:ping><description><![CDATA[<p>设置变量<br />
&lt;s:set name="maxRowIndex" value="%{formInfo.maxRowIndex}"/&gt;</p>
<p>for 循环<br />
&lt;s:bean name="org.apache.struts2.util.Counter" id="counter"&gt;<br />
&nbsp; &lt;s:param name="first" value="0" /&gt;<br />
&nbsp; &lt;s:param name="last" value="#maxRowIndex" /&gt;<br />
&nbsp;&nbsp;&lt;s:iterator&gt;<br />
&nbsp;&nbsp;&lt;/s:iterator&gt;<br />
&lt;/s:bean&gt;</p>
<p>迭代&lt;s:iterator&gt;用于将List、Map、ArrayList等集合进行循环遍历<br />
&lt;s:iterator value="#rowList"&gt;<br />
&lt;/s:iterator&gt;</p>
<p>if语句<br />
&lt;s:if test="#rowList==null"&gt;<br />
&lt;/s:if&gt;</p>
<p>生成html代码<br />
&lt;s:property value="%{formInfo.jsCode}" escape="false"/&gt;<br />
escape="false" 不进行转义</p>
<img src ="http://www.blogjava.net/cjwang-21/aggbug/287642.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cjwang-21/" target="_blank">逆水深寒</a> 2009-07-21 14:21 <a href="http://www.blogjava.net/cjwang-21/archive/2009/07/21/287642.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>