﻿<?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-MikeChen专注电子商务-随笔分类-框架</title><link>http://www.blogjava.net/mikechen/category/50934.html</link><description>电子商务技术架构</description><language>zh-cn</language><lastBuildDate>Wed, 04 Jul 2012 00:46:15 GMT</lastBuildDate><pubDate>Wed, 04 Jul 2012 00:46:15 GMT</pubDate><ttl>60</ttl><item><title>框架-quartz</title><link>http://www.blogjava.net/mikechen/archive/2012/07/03/382090.html</link><dc:creator>陈睿</dc:creator><author>陈睿</author><pubDate>Tue, 03 Jul 2012 06:42:00 GMT</pubDate><guid>http://www.blogjava.net/mikechen/archive/2012/07/03/382090.html</guid><wfw:comment>http://www.blogjava.net/mikechen/comments/382090.html</wfw:comment><comments>http://www.blogjava.net/mikechen/archive/2012/07/03/382090.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mikechen/comments/commentRss/382090.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mikechen/services/trackbacks/382090.html</trackback:ping><description><![CDATA[<strong style="font-size: 12pt; ">一：quartz简介</strong><br style="font-size: 10pt; " /><span style="font-size: 10pt; ">&nbsp; &nbsp; &nbsp; &nbsp;OpenSymphony 的Quartz提供了一个比较完美的任务调度解决方案。</span><div style="font-size: 10pt; ">&nbsp; &nbsp; &nbsp; &nbsp;Quartz 是个开源的作业调度框架，定时调度器，为在 Java 应用程序中进行作业调度提供了简单却强大的机制。</div><div style="font-size: 10pt; ">&nbsp; &nbsp; &nbsp; &nbsp;Quartz中有两个基本概念：作业和触发器。作业是能够调度的可执行任务，触发器提供了对作业的调度<br /><br /><strong style="font-size: 12pt; ">二：quartz spring配置详解</strong><br /><ul><li>&nbsp;<strong>为什么不适用<span style="color: #333333; font-family: Verdana, Arial, sans-serif, 'Lucida Grande'; font-size: 13px; line-height: 23px; text-align: left; background-color: #d6d3d6; ">java.util.Timer结合java.util.TimerTask</span>&nbsp;</strong></li></ul>&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.主要的原因，适用不方便，特别是制定具体的年月日时分的时间，而quartz使用类似linux上的cron配置，很方便的配置每隔时间执行触发。<br /><br />&nbsp; &nbsp; &nbsp;&nbsp;&nbsp;&nbsp;2.其次性能的原因，使用jdk自带的Timer不具备多线程，而quartz采用线程池，性能上比timer高出很多。<br /><br /><br /><ul><li>&nbsp; &nbsp;<strong>详解quartz在spring里面的配置</strong></li></ul>&nbsp; &nbsp; 在spring里主要分为两种使用方式：第一种，也是目前使用最多的方式，spring提供的MethodInvokingJobDetailFactoryBean代理类，通过雷利类直接调用任务类的某个函数；第二种,程序里实现quartz接口，quartz通过该接口进行调度。<br /><br />&nbsp; &nbsp; &nbsp; <strong>主要讲解通过spring提供的代理类MethodInvokingJobDetailFactoryBean</strong><br /><br />&nbsp;<strong> &nbsp; &nbsp; &nbsp; 1.业务逻辑类:业务逻辑是独立的，本身就与quartz解耦的，并没有深入进去，这对业务来讲是很好的一个方式。<br /></strong><br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="background-color: #eeeeee; font-size: 13px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="font-size: 13px; color: #0000ff; ">public</span><span style="background-color: #eeeeee; font-size: 13px; ">&nbsp;</span><span style="font-size: 13px; color: #0000ff; ">class</span><span style="background-color: #eeeeee; font-size: 13px; ">&nbsp;&nbsp;TestJobTask{</span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*业务逻辑处理<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;&nbsp;&nbsp;service(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; ">业务逻辑</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><img src="http://www.blogjava.net/Images/dot.gif" alt="" /><img src="http://www.blogjava.net/Images/dot.gif" alt="" />..<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}</div>&nbsp; &nbsp; &nbsp; &nbsp;<br /><strong>&nbsp; &nbsp; 2.增加一个线程池</strong><br />&nbsp; &nbsp;&nbsp;<span style="font-size: 13px; color: #008000; ">&lt;!--</span><span style="font-size: 13px; color: #008000; ">&nbsp;线程执行器配置，用于任务注册&nbsp;</span><span style="font-size: 13px; color: #008000; ">--&gt;</span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">bean&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="executor"</span><span style="color: #FF0000; ">&nbsp;class</span><span style="color: #0000FF; ">="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="corePoolSize"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="10"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="maxPoolSize"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="100"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="queueCapacity"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="500"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br /><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">bean</span><span style="color: #0000FF; ">&gt;</span></div><br /><strong>&nbsp; 3.定义业务逻辑类<br /></strong><br />&nbsp; &nbsp;&nbsp;<span style="font-size: 13px; color: #008000; ">&lt;!--</span><span style="font-size: 13px; color: #008000; ">&nbsp;业务对象&nbsp;</span><span style="font-size: 13px; color: #008000; ">--&gt;</span><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; "><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">bean&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="testJobTask"</span><span style="color: #FF0000; ">&nbsp;class</span><span style="color: #0000FF; ">="com.mike.scheduling.TestJobTask"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span></div><br /><br /><strong>&nbsp; &nbsp; 4.增加quartz调用业务逻辑<br /></strong><br />&nbsp; &nbsp;&nbsp;<span style="font-size: 13px; color: #008000; ">&lt;!--</span><span style="font-size: 13px; color: #008000; ">&nbsp;调度业务&nbsp;</span><span style="font-size: 13px; color: #008000; ">--&gt;</span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">bean&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="jobDetail"</span><span style="color: #FF0000; ">&nbsp;class</span><span style="color: #0000FF; ">="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="targetObject"</span><span style="color: #FF0000; ">&nbsp;ref</span><span style="color: #0000FF; ">="testJobTask"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="targetMethod"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="service"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br /><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">bean</span><span style="color: #0000FF; ">&gt;</span></div><br />&nbsp; &nbsp; <strong>5.增加调用的触发器，触发的时间，有两种方式：<br /></strong><br />&nbsp; &nbsp; &nbsp;<strong>第一种触发时间，采用类似linux的cron，配置时间的表示发出丰富 </strong>&nbsp;<br /><span style="font-size: 13px; color: #0000ff; ">&nbsp; &lt;</span><span style="font-size: 13px; color: #800000; ">bean&nbsp;</span><span style="font-size: 13px; color: #ff0000; ">id</span><span style="font-size: 13px; color: #0000ff; ">="cronTrigger"</span><span style="font-size: 13px; color: #ff0000; ">&nbsp;class</span><span style="font-size: 13px; color: #0000ff; ">="org.springframework.scheduling.quartz.CronTriggerBean"</span><span style="font-size: 13px; color: #0000ff; ">&gt;</span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all">&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="jobDetail"</span><span style="color: #FF0000; ">&nbsp;ref</span><span style="color: #0000FF; ">="jobDetail"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="cronExpression"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="10&nbsp;0/1&nbsp;*&nbsp;*&nbsp;*&nbsp;?"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br /><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">bean</span><span style="color: #0000ff; ">&gt;</span></div>&nbsp;&nbsp;<span style="color: #333333; font-family: Verdana, Arial, sans-serif, 'Lucida Grande'; font-size: 13px; line-height: 23px; text-align: left; background-color: #d6d3d6; ">Cron表达式&#8220;10 */1 * * * ?&#8221;意为：从10秒开始，每1分钟执行一次</span>&nbsp;<br />&nbsp;&nbsp;<br />&nbsp; &nbsp; 第二种，采用比较简话的方式，申明延迟时间和间隔时间<br /><span style="font-size: 13px; color: #0000ff; ">&nbsp; &lt;</span><span style="font-size: 13px; color: #800000; ">bean&nbsp;</span><span style="font-size: 13px; color: #ff0000; ">id</span><span style="font-size: 13px; color: #0000ff; ">="taskTrigger"</span><span style="font-size: 13px; color: #ff0000; ">&nbsp;class</span><span style="font-size: 13px; color: #0000ff; ">="org.springframework.scheduling.quartz.SimpleTriggerBean"</span><span style="font-size: 13px; color: #0000ff; ">&gt;</span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all">&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="jobDetail"</span><span style="color: #FF0000; ">&nbsp;ref</span><span style="color: #0000FF; ">="jobDetail"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="startDelay"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="10000"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="repeatInterval"</span><span style="color: #FF0000; ">&nbsp;value</span><span style="color: #0000FF; ">="60000"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br /><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">bean</span><span style="color: #0000FF; ">&gt;</span></div>&nbsp;&nbsp;<span style="color: #333333; font-family: Verdana, Arial, sans-serif, 'Lucida Grande'; font-size: 13px; line-height: 23px; text-align: left; background-color: #d6d3d6; ">延迟10秒启动，然后每隔1分钟执行一次</span>&nbsp;<br /><br />&nbsp; &nbsp;<strong> 6.开始调用<br /></strong><br />&nbsp; &nbsp; &nbsp;&nbsp;<span style="font-size: 13px; color: #008000; ">&lt;!--</span><span style="font-size: 13px; color: #008000; ">&nbsp;设置调度&nbsp;</span><span style="font-size: 13px; color: #008000; ">--&gt;</span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">bean&nbsp;</span><span style="color: #FF0000; ">class</span><span style="color: #0000FF; ">="org.springframework.scheduling.quartz.SchedulerFactoryBean"</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="triggers"</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">list</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">ref&nbsp;</span><span style="color: #FF0000; ">bean</span><span style="color: #0000FF; ">="cronTrigger"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">list</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">property</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">property&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="taskExecutor"</span><span style="color: #FF0000; ">&nbsp;ref</span><span style="color: #0000FF; ">="executor"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br /><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">bean</span><span style="color: #0000FF; ">&gt;</span></div><br /><strong>&nbsp; &nbsp;7.结束：启动容器即可，已经将spring和quartz结合完毕。</strong><br /><br />&nbsp; <strong>&nbsp; Cron常用的表达式</strong><br />&nbsp; &nbsp;&nbsp;<span style="background-color: #eeeeee; font-size: 13px; ">"0&nbsp;0&nbsp;12&nbsp;*&nbsp;*&nbsp;?"&nbsp;每天中午12点触发</span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all">"0&nbsp;15&nbsp;10&nbsp;?&nbsp;*&nbsp;*"&nbsp;每天上午10:15触发<br />"0&nbsp;15&nbsp;10&nbsp;*&nbsp;*&nbsp;?"&nbsp;每天上午10:15触发<br />"0&nbsp;15&nbsp;10&nbsp;*&nbsp;*&nbsp;?&nbsp;*"&nbsp;每天上午10:15触发<br />"0&nbsp;15&nbsp;10&nbsp;*&nbsp;*&nbsp;?&nbsp;2005"&nbsp;2005年的每天上午10:15触发<br />"0&nbsp;*&nbsp;14&nbsp;*&nbsp;*&nbsp;?"&nbsp;在每天下午2点到下午2:59期间的每1分钟触发<br />"0&nbsp;0/5&nbsp;14&nbsp;*&nbsp;*&nbsp;?"&nbsp;在每天下午2点到下午2:55期间的每5分钟触发<br />"0&nbsp;0/5&nbsp;14,18&nbsp;*&nbsp;*&nbsp;?"&nbsp;在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发<br />"0&nbsp;0-5&nbsp;14&nbsp;*&nbsp;*&nbsp;?"&nbsp;在每天下午2点到下午2:05期间的每1分钟触发<br />"0&nbsp;10,44&nbsp;14&nbsp;?&nbsp;3&nbsp;WED"&nbsp;每年三月的星期三的下午2:10和2:44触发<br />"0&nbsp;15&nbsp;10&nbsp;?&nbsp;*&nbsp;MON-FRI"&nbsp;周一至周五的上午10:15触发<br />"0&nbsp;15&nbsp;10&nbsp;15&nbsp;*&nbsp;?"&nbsp;每月15日上午10:15触发<br />"0&nbsp;15&nbsp;10&nbsp;L&nbsp;*&nbsp;?"&nbsp;每月最后一日的上午10:15触发<br />"0&nbsp;15&nbsp;10&nbsp;?&nbsp;*&nbsp;6L"&nbsp;每月的最后一个星期五上午10:15触发&nbsp;<br />"0&nbsp;15&nbsp;10&nbsp;?&nbsp;*&nbsp;6L&nbsp;2002-2005"&nbsp;2002年至2005年的每月的最后一个星期五上午10:15触发<br />"0&nbsp;15&nbsp;10&nbsp;?&nbsp;*&nbsp;6#3"&nbsp;每月的第三个星期五上午10:15触发</div><br /><strong style="font-size: 12pt; ">三：quartz原理<br /></strong><br />&nbsp; &nbsp; <strong>根据上面spring的配置，我们就比较清楚quartz的内部情况，下面我们主要详解配置涉及到的每个点</strong><br />&nbsp; &nbsp; 1.我们先从最后一个步骤看起，<span style="font-family: 宋体, arial, serif; font-size: 14px; line-height: 24px; background-color: #f5f8fd; ">SchedulerFactoryBean</span>&nbsp;，scheduler的工厂实现，里面可以生产出对应的多个jobDetail和trigger，每个jobDetail对应trigger代表一个任务<br />&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="font-size: 10pt; ">&nbsp;Quartz的SchedulerFactory是标准的工厂类，不太适合在Spring环境下使用。此外，为了保证Scheduler能够感知 Spring容器的生命周期，完成自动启动和关闭的操作，必须让Scheduler和Spring容器的生命周期相关联。以便在Spring容器启动后， Scheduler自动开始工作，而在Spring容器关闭前，自动关闭Scheduler。为此，Spring提供 SchedulerFactoryBean，这个FactoryBean大致拥有以下的功能：&nbsp;</span><div>&nbsp; &nbsp; &nbsp;1)以更具Bean风格的方式为Scheduler提供配置信息；&nbsp;</div><div>&nbsp; &nbsp; &nbsp;2)让Scheduler和Spring容器的生命周期建立关联，相生相息；&nbsp;</div><div>&nbsp; &nbsp; &nbsp;3)通过属性配置部分或全部代替Quartz自身的配置文件。&nbsp;</div><div>&nbsp; 2.jobDetail,表示一个可执行的业务调用<br />&nbsp;&nbsp;<br />&nbsp; 3.trigger:调度的时间计划，什么时候，每隔多少时间可执行等时间计划<br /><br />&nbsp; 4.<span style="font-size: 10pt; "></span><span style="font-size: 10pt; ">ThreadPoolTaskExecutor，线程池，用来并行执行每个对应的job，提高效率，这也是上面提到不推荐使用jdk自身timer的一个很重要的原因</span></div><div></div></div><img src ="http://www.blogjava.net/mikechen/aggbug/382090.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mikechen/" target="_blank">陈睿</a> 2012-07-03 14:42 <a href="http://www.blogjava.net/mikechen/archive/2012/07/03/382090.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>框架-spring</title><link>http://www.blogjava.net/mikechen/archive/2012/02/29/370992.html</link><dc:creator>陈睿</dc:creator><author>陈睿</author><pubDate>Wed, 29 Feb 2012 06:45:00 GMT</pubDate><guid>http://www.blogjava.net/mikechen/archive/2012/02/29/370992.html</guid><wfw:comment>http://www.blogjava.net/mikechen/comments/370992.html</wfw:comment><comments>http://www.blogjava.net/mikechen/archive/2012/02/29/370992.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mikechen/comments/commentRss/370992.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mikechen/services/trackbacks/370992.html</trackback:ping><description><![CDATA[<strong>一：spring概要</strong><br />&nbsp;&nbsp; &nbsp;<span class="Apple-style-span" style="font-family: arial, 宋体, sans-serif; line-height: 24px; ">简单来说，Spring是一个轻量级的控制反转（<a target="_blank" href="http://baike.baidu.com/view/146665.htm" style="text-decoration: underline; color: #136ec2; ">IoC</a>）和面向切面（<a target="_blank" href="http://baike.baidu.com/view/73626.htm" style="text-decoration: underline; color: #136ec2; ">AOP</a>）的容器框架。<br />&nbsp;&nbsp; &nbsp;</span>&#9670;<strong>控制反转</strong>&#8212;&#8212;Spring通过一种称作控制反转（IoC）的技术促进了松耦合。当应用了IoC，一个对象依赖的其它对象会通过被动的方式传递进来，而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反&#8212;&#8212;不是对象从容器中查找依赖，而是容器在对象初始化时不等对象请求就主动将依赖传递给它。<div><div style="height: 14px; line-height: 14px; font-size: 12px; overflow-x: hidden; overflow-y: hidden; "></div>　　&#9670;<strong>面向切面</strong>&#8212;&#8212;Spring提供了<a target="_blank" href="http://baike.baidu.com/view/1865230.htm" style="text-decoration: underline; color: #136ec2; ">面向切面编程</a>的丰富支持，允许通过分离应用的业务逻辑与系统级服务（例如审计（auditing）和事务（transaction）管理）进行内聚性的开发。应用对象只实现它们应该做的&#8212;&#8212;完成业务逻辑&#8212;&#8212;仅此而已。它们并不负责（甚至是意识）其它的系统级关注点，例如日志或事务支持。<div style="height: 14px; line-height: 14px; font-size: 12px; overflow-x: hidden; overflow-y: hidden; "></div>　　&#9670;<strong>容器</strong>&#8212;&#8212;Spring包含并管理应用对象的配置和生命周期，在这个意义上它是一种容器，你可以配置你的每个bean如何被创建&#8212;&#8212;基于一个可配置<a target="_blank" href="http://baike.baidu.com/view/228368.htm" style="text-decoration: underline; color: #136ec2; ">原型</a>（prototype），你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例&#8212;&#8212;以及它们是如何相互关联的。然而，Spring不应该被混同于传统的重量级的EJB容器，它们经常是庞大与笨重的，难以使用。<div style="height: 14px; line-height: 14px; font-size: 12px; overflow-x: hidden; overflow-y: hidden; "></div>　　&#9670;<strong>框架</strong>&#8212;&#8212;Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中，应用对象被声明式地组合，典型地是在一个XML文件里。Spring也提供了很多基础功能（事务管理、持久化框架集成等等），将应用逻辑的开发留给了你。<div style="height: 14px; line-height: 14px; font-size: 12px; overflow-x: hidden; overflow-y: hidden; "></div>　　所有Spring的这些特征使你能够编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础支持。<br /><br /><strong>二：spring的整个生命周期</strong><br />&nbsp;&nbsp; &nbsp;<strong>首先说一下spring的整个初始化过程，web应用中创建spring容器有两种方式：</strong><br />&nbsp;&nbsp; &nbsp;第一种：在web.xml里直接配置spring容器，servletcontextlistener<br />&nbsp;&nbsp; &nbsp;第二种：通过load-on-startup servlet实现。<br />&nbsp;&nbsp; &nbsp;主要就说一下第一种方式：<br />&nbsp;&nbsp; &nbsp;spring提供了ServletContextListener的实现类ContextLoaderListener,该类作为listener使用，在创建时自动查找WEB-INF目录下的applicationContext.xml,该文件是默认查找的，如果只有一个就不需要配置初始化xml参数，如果需要配置，设置contextConfigLocation为application的xml文件即可。可以好好阅读一下ContextLoaderListener的源代码，就可以很清楚的知道spring的整个加载过程。<br />&nbsp;&nbsp; &nbsp;spring容器的初始化代码如下：<br />&nbsp;&nbsp; &nbsp;<span class="Apple-style-span" style="color: #008000; font-size: 13px; ">/**</span><div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><font class="Apple-style-span" color="#008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Initialize&nbsp;the&nbsp;root&nbsp;web&nbsp;application&nbsp;context.</font><br /><font class="Apple-style-span" color="#008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><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;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;contextInitialized(ServletContextEvent&nbsp;event)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.contextLoader&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;createContextLoader();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.contextLoader&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.contextLoader&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.contextLoader.initWebApplicationContext(event.getServletContext());</span><span style="color: red; ">//contextLoader初始化web应用容器<br /></span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>&nbsp;&nbsp; &nbsp;继续分析initWebApplicationContext做了什么事情：<br />&nbsp;&nbsp;&nbsp;&nbsp;<div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Initialize&nbsp;Spring's&nbsp;web&nbsp;application&nbsp;context&nbsp;for&nbsp;the&nbsp;given&nbsp;servlet&nbsp;context,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;according&nbsp;to&nbsp;the&nbsp;"{</span><span style="color: #808080; ">@link</span><span style="color: #008000; ">&nbsp;#CONTEXT_CLASS_PARAM&nbsp;contextClass}"&nbsp;and<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;"{</span><span style="color: #808080; ">@link</span><span style="color: #008000; ">&nbsp;#CONFIG_LOCATION_PARAM&nbsp;contextConfigLocation}"&nbsp;context-params.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;servletContext&nbsp;current&nbsp;servlet&nbsp;context<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@return</span><span style="color: #008000; ">&nbsp;the&nbsp;new&nbsp;WebApplicationContext<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@see</span><span style="color: #008000; ">&nbsp;#CONTEXT_CLASS_PARAM<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@see</span><span style="color: #008000; ">&nbsp;#CONFIG_LOCATION_PARAM<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;WebApplicationContext&nbsp;initWebApplicationContext(ServletContext&nbsp;servletContext)&nbsp;{<br />&nbsp;&nbsp; &nbsp; &nbsp; </span><span style="color: red; ">//首先创建一个spring的父容器，类似根节点root容器，而且只能是一个，如果已经创建，抛出对应的异常</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; ">&nbsp;(servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE)&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">throw</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;IllegalStateException(<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; ">"</span><span style="color: #000000; ">Cannot&nbsp;initialize&nbsp;context&nbsp;because&nbsp;there&nbsp;is&nbsp;already&nbsp;a&nbsp;root&nbsp;application&nbsp;context&nbsp;present&nbsp;-&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</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; ">"</span><span style="color: #000000; ">check&nbsp;whether&nbsp;you&nbsp;have&nbsp;multiple&nbsp;ContextLoader*&nbsp;definitions&nbsp;in&nbsp;your&nbsp;web.xml!</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log&nbsp;logger&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;LogFactory.getLog(ContextLoader.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;servletContext.log(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Initializing&nbsp;Spring&nbsp;root&nbsp;WebApplicationContext</span><span style="color: #000000; ">"</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; ">&nbsp;(logger.isInfoEnabled())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.info(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Root&nbsp;WebApplicationContext:&nbsp;initialization&nbsp;started</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;startTime&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;System.currentTimeMillis();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Determine&nbsp;parent&nbsp;for&nbsp;root&nbsp;web&nbsp;application&nbsp;context,&nbsp;if&nbsp;any.</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ApplicationContext&nbsp;parent&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;loadParentContext(servletContext);</span><span style="color: red; ">//创建通过web.xml配置的父容器&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; "><br /></span><span style="color: red; ">具体里面的代码是怎么实现的，就不在这里进行详解了</span><span style="color: #000000; "><br /></span><span style="color: red; ">//</span><span style="color: red; ">&nbsp;Store&nbsp;context&nbsp;in&nbsp;local&nbsp;instance&nbsp;variable,&nbsp;to&nbsp;guarantee&nbsp;that<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: red; ">//</span><span style="color: red; ">&nbsp;it&nbsp;is&nbsp;available&nbsp;on&nbsp;ServletContext&nbsp;shutdown.</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><strong><span style="color: red; ">this</span><span style="color: red; ">.context&nbsp;</span><span style="color: red; ">=</span><span style="color: red; ">&nbsp;createWebApplicationContext(servletContext,&nbsp;parent);</span></strong><span style="color: red; ">//主要的创建过程都在改方法内，可以自己去看源代码</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.context);<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: red; ">//把spring初始好的容器加载到servletcontext内，相当于servletcontext包含webapplicationcontext</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClassLoader&nbsp;ccl&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Thread.currentThread().getContextClassLoader();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(ccl&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;ContextLoader.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">.getClassLoader())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;currentContext&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.context;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(ccl&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;currentContextPerThread.put(ccl,&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.context);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(logger.isDebugEnabled())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.debug(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Published&nbsp;root&nbsp;WebApplicationContext&nbsp;as&nbsp;ServletContext&nbsp;attribute&nbsp;with&nbsp;name&nbsp;[</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</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;&nbsp;&nbsp;&nbsp;&nbsp;WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">]</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(logger.isInfoEnabled())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">long</span><span style="color: #000000; ">&nbsp;elapsedTime&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;System.currentTimeMillis()&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;startTime;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.info(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Root&nbsp;WebApplicationContext:&nbsp;initialization&nbsp;completed&nbsp;in&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;elapsedTime&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;ms</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.context;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(RuntimeException&nbsp;ex)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.error(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Context&nbsp;initialization&nbsp;failed</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;ex);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,&nbsp;ex);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">throw</span><span style="color: #000000; ">&nbsp;ex;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(Error&nbsp;err)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.error(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Context&nbsp;initialization&nbsp;failed</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;err);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,&nbsp;err);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">throw</span><span style="color: #000000; ">&nbsp;err;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span></div>&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp; &nbsp;看到这里基本已经清楚了整个spring容器的加载过程，如果还想了解更加深入，请查看我红色标注的方法体。<br /><br />&nbsp;&nbsp; &nbsp;<strong>其次再说一下spring的IOC和AOP使用的场景，由于原理大家都很清楚了，那就说一下它们使用到的地方：<br />&nbsp;&nbsp;&nbsp;</strong><br />&nbsp;&nbsp; &nbsp;IOC使用的场景：<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;管理bean的依赖关系，目前主流的电子商务网站基本都采用spring管理业务层代码的依赖关系，包括:淘宝，支付宝，阿里巴巴，百度等公司。<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;</div><img src ="http://www.blogjava.net/mikechen/aggbug/370992.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mikechen/" target="_blank">陈睿</a> 2012-02-29 14:45 <a href="http://www.blogjava.net/mikechen/archive/2012/02/29/370992.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>框架-struts2</title><link>http://www.blogjava.net/mikechen/archive/2012/02/27/370857.html</link><dc:creator>陈睿</dc:creator><author>陈睿</author><pubDate>Mon, 27 Feb 2012 09:07:00 GMT</pubDate><guid>http://www.blogjava.net/mikechen/archive/2012/02/27/370857.html</guid><wfw:comment>http://www.blogjava.net/mikechen/comments/370857.html</wfw:comment><comments>http://www.blogjava.net/mikechen/archive/2012/02/27/370857.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/mikechen/comments/commentRss/370857.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mikechen/services/trackbacks/370857.html</trackback:ping><description><![CDATA[<strong>一：struts2概要</strong><br />&nbsp;&nbsp; &nbsp;以WebWork优秀设计思想为核心，吸收了struts1的部分优点。<br /><br /><strong>二：struts2详解</strong><br />&nbsp;&nbsp; &nbsp;主要就是详解struts2与struts1之间的区别，以及为什么要采用webwork重新设计新框架，以及吸收了struts1的哪部分优点。<br />&nbsp;&nbsp; <strong>&nbsp;首先将区别：</strong><br /><ul><li>&nbsp;&nbsp; &nbsp;最大的区别是与servlet成功解耦，不在依赖容器来初始化HttpServletRequest和HttpServletResponse</li></ul><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;">&nbsp;&nbsp; &nbsp;struts1里依赖的核心控制器为ActionServlet而struts2依赖ServletDispatcher,一个是servlet一个是filter,正是采用了filter才不至于和servlet耦合，所有的数据&nbsp;都是通过拦截器来实现，如下图显示：</blockquote>&nbsp;&nbsp; &nbsp;<img src="http://www.blogjava.net/images/blogjava_net/mikechen/struts2-过滤器.jpg" border="0" alt="" width="333" height="279" /><br /><br /><ul><li>&nbsp;&nbsp; &nbsp;web层表现层的丰富，struts2已经可以使用jsp、velocity、freemarker</li><li>&nbsp;&nbsp; &nbsp;线程模式方面：struts1的action是单例模式而且必须是线程安全或同步的，是struts2的action对每一个请求都产生一个新的实例，因此没有线程安全问 &nbsp; &nbsp; &nbsp; 题。</li><li>&nbsp;&nbsp; &nbsp;封装请求参数：是struts1采用ActionForm封装请求参数，都必须继承ActionForm基类，而struts2通过bean的属性封装，大大降低了耦合。</li><li>&nbsp;&nbsp; &nbsp;类型转换：struts1封装的ActionForm都是String类型，采用Commons- Beanutils进行类型转换，每个类一个转换器；struts2采用OGNL进行类型转 &nbsp; &nbsp; &nbsp; 换，支持基本数据类型和封装类型的自动转换。</li><li>&nbsp;&nbsp; &nbsp;数据校验：struts1在ActionForm中重写validate方法；struts2直接重写validate方法，直接在action里面重写即可，不需要继承任何基类，实际的调用顺序是，validate()--&gt;execute()，会在执行execute之前调用validate,也支持xwork校验框架来校验。</li></ul><strong>&nbsp;&nbsp; &nbsp;其次，讲一下为什么要采用webwork来重新设计struts2<br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;</strong> 首先的从核心控制器谈起，struts2的FilterDispatcher，这里我们知道是一个filter而不是一个servlet,讲到这里很多人还不是很清楚web.xml里它们之间的联系，先简短讲一下它们的加载顺序，context-param(应用范围的初始化参数)--&gt;listener(监听应用端的任何修改通知)--&gt;filter(过滤)--&gt;servlet。<br />&nbsp;&nbsp; &nbsp;filter在执行servlet之间就以及调用了，所以才有可能解脱完全依赖servlet的局面，那我们来看看这个filter做了什么事情：<br />&nbsp;&nbsp; &nbsp;<span class="Apple-style-span" style="color: #008000; font-size: 13px; ">/**</span><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><font class="Apple-style-span" color="#008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Process&nbsp;an&nbsp;action&nbsp;or&nbsp;handle&nbsp;a&nbsp;request&nbsp;a&nbsp;static&nbsp;resource.</font><br /><font class="Apple-style-span" color="#008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&lt;p/&gt;</font><br /><font class="Apple-style-span" color="#008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;The&nbsp;filter&nbsp;tries&nbsp;to&nbsp;match&nbsp;the&nbsp;request&nbsp;to&nbsp;an&nbsp;action&nbsp;mapping.</font><br /><font class="Apple-style-span" color="#008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;If&nbsp;mapping&nbsp;is&nbsp;found,&nbsp;the&nbsp;action&nbsp;processes&nbsp;is&nbsp;delegated&nbsp;to&nbsp;the&nbsp;dispatcher's&nbsp;serviceAction&nbsp;method.</font><br /><font class="Apple-style-span" color="#008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;If&nbsp;action&nbsp;processing&nbsp;fails,&nbsp;doFilter&nbsp;will&nbsp;try&nbsp;to&nbsp;create&nbsp;an&nbsp;error&nbsp;page&nbsp;via&nbsp;the&nbsp;dispatcher.</font><br /><font class="Apple-style-span" color="#008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&lt;p/&gt;</font><br /><font class="Apple-style-span" color="#008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Otherwise,&nbsp;if&nbsp;the&nbsp;request&nbsp;is&nbsp;for&nbsp;a&nbsp;static&nbsp;resource,</font><br /><font class="Apple-style-span" color="#008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;the&nbsp;resource&nbsp;is&nbsp;copied&nbsp;directly&nbsp;to&nbsp;the&nbsp;response,&nbsp;with&nbsp;the&nbsp;appropriate&nbsp;caching&nbsp;headers&nbsp;set.</font><br /><font class="Apple-style-span" color="#008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&lt;p/&gt;</font><br /><font class="Apple-style-span" color="#008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;If&nbsp;the&nbsp;request&nbsp;does&nbsp;not&nbsp;match&nbsp;an&nbsp;action&nbsp;mapping,&nbsp;or&nbsp;a&nbsp;static&nbsp;resource&nbsp;page,</font><br /><font class="Apple-style-span" color="#008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;then&nbsp;it&nbsp;passes&nbsp;through.</font><br /><font class="Apple-style-span" color="#008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*</font><br /><font class="Apple-style-span" color="#008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</font><span style="color: #808080; ">@see</span><span style="color: #008000; ">&nbsp;javax.servlet.Filter#doFilter(javax.servlet.ServletRequest,&nbsp;javax.servlet.ServletResponse,&nbsp;javax.servlet.FilterChain)<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;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;doFilter(ServletRequest&nbsp;req,&nbsp;ServletResponse&nbsp;res,&nbsp;FilterChain&nbsp;chain)&nbsp;</span><span style="color: #0000FF; ">throws</span><span style="color: #000000; ">&nbsp;IOException,&nbsp;ServletException&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletRequest&nbsp;request&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(HttpServletRequest)&nbsp;req;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletResponse&nbsp;response&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(HttpServletResponse)&nbsp;res;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServletContext&nbsp;servletContext&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;getServletContext();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;timerKey&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">FilterDispatcher_doFilter:&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;FIXME:&nbsp;this&nbsp;should&nbsp;be&nbsp;refactored&nbsp;better&nbsp;to&nbsp;not&nbsp;duplicate&nbsp;work&nbsp;with&nbsp;the&nbsp;action&nbsp;invocation</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ValueStack&nbsp;stack&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;dispatcher.getContainer().getInstance(ValueStackFactory.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">).createValueStack();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionContext&nbsp;ctx&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ActionContext(stack.getContext());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionContext.setContext(ctx);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UtilTimerStack.push(timerKey);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;prepareDispatcherAndWrapRequest(request,&nbsp;response);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionMapping&nbsp;mapping;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mapping&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;actionMapper.getMapping(request,&nbsp;dispatcher.getConfigurationManager());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">catch</span><span style="color: #000000; ">&nbsp;(Exception&nbsp;ex)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.error(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">error&nbsp;getting&nbsp;ActionMapping</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;ex);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dispatcher.sendError(request,&nbsp;response,&nbsp;servletContext,&nbsp;HttpServletResponse.SC_INTERNAL_SERVER_ERROR,&nbsp;ex);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(mapping&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;there&nbsp;is&nbsp;no&nbsp;action&nbsp;in&nbsp;this&nbsp;request,&nbsp;should&nbsp;we&nbsp;look&nbsp;for&nbsp;a&nbsp;static&nbsp;resource?</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;resourcePath&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;RequestUtils.getServletPath(request);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">""</span><span style="color: #000000; ">.equals(resourcePath)&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">null</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">&nbsp;request.getPathInfo())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resourcePath&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;request.getPathInfo();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(staticResourceLoader.canHandle(resourcePath))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;staticResourceLoader.findStaticResource(resourcePath,&nbsp;request,&nbsp;response);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;{<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: #008000; ">//</span><span style="color: #008000; ">&nbsp;this&nbsp;is&nbsp;a&nbsp;normal&nbsp;request,&nbsp;let&nbsp;it&nbsp;pass&nbsp;through</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;chain.doFilter(request,&nbsp;response);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;The&nbsp;framework&nbsp;did&nbsp;its&nbsp;job&nbsp;here</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dispatcher.serviceAction(request,&nbsp;response,&nbsp;servletContext,&nbsp;mapping);</span><span style="color: red; ">//过滤用户请求，拦截器执行，把对应的action请求转到业务action执行&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">finally</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">try</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionContextCleanUp.cleanUp(req);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">finally</span><span style="color: #000000; ">&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UtilTimerStack.pop(timerKey);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp; &nbsp;对应的action参数由拦截器获取。<br />&nbsp;&nbsp; &nbsp;解耦servlet是struts2采用webwork思路的最重要的一个原因，也迎合了整个技术的一个发展方向，解耦一直贯穿于整个框架。</span></div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;<img src ="http://www.blogjava.net/mikechen/aggbug/370857.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mikechen/" target="_blank">陈睿</a> 2012-02-27 17:07 <a href="http://www.blogjava.net/mikechen/archive/2012/02/27/370857.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>