﻿<?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-我的漫漫程序之旅-文章分类-Spring</title><link>http://www.blogjava.net/supercrsky/category/27531.html</link><description>专注于JavaWeb开发</description><language>zh-cn</language><lastBuildDate>Mon, 28 Jan 2008 19:37:51 GMT</lastBuildDate><pubDate>Mon, 28 Jan 2008 19:37:51 GMT</pubDate><ttl>60</ttl><item><title>使用Spring的CharacterEncodingFilter应注意的问题</title><link>http://www.blogjava.net/supercrsky/articles/178219.html</link><dc:creator>々上善若水々</dc:creator><author>々上善若水々</author><pubDate>Mon, 28 Jan 2008 09:45:00 GMT</pubDate><guid>http://www.blogjava.net/supercrsky/articles/178219.html</guid><wfw:comment>http://www.blogjava.net/supercrsky/comments/178219.html</wfw:comment><comments>http://www.blogjava.net/supercrsky/articles/178219.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/supercrsky/comments/commentRss/178219.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/supercrsky/services/trackbacks/178219.html</trackback:ping><description><![CDATA[这是我的web.xml中配置:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;列表组件导出过滤器&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">eXtremeExport</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.extremecomponents.table.filter.ExportFilter<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">eXtremeExport</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">*.do</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;著名&nbsp;Character&nbsp;Encoding&nbsp;filter&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">encodingFilter</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.springframework.web.filter.CharacterEncodingFilter<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">encoding</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">GBK</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">encodingFilter</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/*</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span></div>
<br />
看不出有什么问题,可当我插入测试数据时全是乱码.<br />
数据库本身是没有问题的.<br />
<br />
后来终于找到了解决的方法,原创列表组件的filter对<br />
CharacterEncodingFilter的过滤有影响.调整一下顺序就行了.<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;著名&nbsp;Character&nbsp;Encoding&nbsp;filter&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">encodingFilter</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.springframework.web.filter.CharacterEncodingFilter<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">encoding</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">GBK</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">encodingFilter</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/*</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;列表组件导出过滤器&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">eXtremeExport</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.extremecomponents.table.filter.ExportFilter<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">eXtremeExport</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">*.do</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span></div>
<br />
调整后CharacterEncodingFilter表现良好,一切正常.就不会再出来<br />
乱码的问题了.
 <img src ="http://www.blogjava.net/supercrsky/aggbug/178219.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/supercrsky/" target="_blank">々上善若水々</a> 2008-01-28 17:45 <a href="http://www.blogjava.net/supercrsky/articles/178219.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring发送邮件的简单例子</title><link>http://www.blogjava.net/supercrsky/articles/174712.html</link><dc:creator>々上善若水々</dc:creator><author>々上善若水々</author><pubDate>Fri, 11 Jan 2008 12:32:00 GMT</pubDate><guid>http://www.blogjava.net/supercrsky/articles/174712.html</guid><wfw:comment>http://www.blogjava.net/supercrsky/comments/174712.html</wfw:comment><comments>http://www.blogjava.net/supercrsky/articles/174712.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/supercrsky/comments/commentRss/174712.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/supercrsky/services/trackbacks/174712.html</trackback:ping><description><![CDATA[注意在做此例前确认你已经加入了<br />
spring-misc相关包<br />
以及mail.jar,activation.jar.<br />
如没有可到我的网盘下载.<br />
bean.xml:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">beans<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://www.springframework.org/schema/beans"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi</span><span style="color: #0000ff">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation</span><span style="color: #0000ff">="http://www.springframework.org/schema/beans&nbsp;http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="mailSender"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.springframework.mail.javamail.JavaMailSenderImpl"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;mail提供商&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="host"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">smtp.163.com</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="javaMailProperties"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">props</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;用户认证&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="mail.smtp.auth"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">true</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="mail.smtp.timeout"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">25000</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">props</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;用户名&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="username"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">78688287</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;密码&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="password"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">******</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">beans</span><span style="color: #0000ff">&gt;</span></div>
<br />
MailTest.java:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.springframework.context.ApplicationContext;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.springframework.context.support.FileSystemXmlApplicationContext;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.springframework.mail.MailSender;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.springframework.mail.SimpleMailMessage;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MailTest<br />
<img id="Codehighlighter1_263_799_Open_Image" onclick="this.style.display='none'; Codehighlighter1_263_799_Open_Text.style.display='none'; Codehighlighter1_263_799_Closed_Image.style.display='inline'; Codehighlighter1_263_799_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_263_799_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_263_799_Closed_Text.style.display='none'; Codehighlighter1_263_799_Open_Image.style.display='inline'; Codehighlighter1_263_799_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_263_799_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_263_799_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)<br />
<img id="Codehighlighter1_307_796_Open_Image" onclick="this.style.display='none'; Codehighlighter1_307_796_Open_Text.style.display='none'; Codehighlighter1_307_796_Closed_Image.style.display='inline'; Codehighlighter1_307_796_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_307_796_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_307_796_Closed_Text.style.display='none'; Codehighlighter1_307_796_Open_Image.style.display='inline'; Codehighlighter1_307_796_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_307_796_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_307_796_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">得到spring的context对象</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ApplicationContext&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;FileSystemXmlApplicationContext(</span><span style="color: #000000">"</span><span style="color: #000000">/src/com/bean.xml</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">mail提供者</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MailSender&nbsp;sender&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(MailSender)&nbsp;ctx.getBean(</span><span style="color: #000000">"</span><span style="color: #000000">mailSender</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">创建一个简单mail消息对象</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SimpleMailMessage&nbsp;smm&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SimpleMailMessage();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">收件人</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;smm.setTo(</span><span style="color: #000000">"</span><span style="color: #000000">zdw@live.cn</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">发件人地址</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;smm.setFrom(</span><span style="color: #000000">"</span><span style="color: #000000">78688287@163.com</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">标题</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;smm.setSubject(</span><span style="color: #000000">"</span><span style="color: #000000">test</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">内容</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;smm.setText(</span><span style="color: #000000">"</span><span style="color: #000000">这是关于Spring&nbsp;Mail抽象层的简单测试</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">发送</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sender.send(smm);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">提示信息</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">Send&nbsp;Ok!!</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
经测试一切正常.
<img src ="http://www.blogjava.net/supercrsky/aggbug/174712.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/supercrsky/" target="_blank">々上善若水々</a> 2008-01-11 20:32 <a href="http://www.blogjava.net/supercrsky/articles/174712.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我的第一个aspectJ程序</title><link>http://www.blogjava.net/supercrsky/articles/174381.html</link><dc:creator>々上善若水々</dc:creator><author>々上善若水々</author><pubDate>Thu, 10 Jan 2008 10:04:00 GMT</pubDate><guid>http://www.blogjava.net/supercrsky/articles/174381.html</guid><wfw:comment>http://www.blogjava.net/supercrsky/comments/174381.html</wfw:comment><comments>http://www.blogjava.net/supercrsky/articles/174381.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/supercrsky/comments/commentRss/174381.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/supercrsky/services/trackbacks/174381.html</trackback:ping><description><![CDATA[MyClass.java:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MyClass<br />
<img id="Codehighlighter1_35_238_Open_Image" onclick="this.style.display='none'; Codehighlighter1_35_238_Open_Text.style.display='none'; Codehighlighter1_35_238_Closed_Image.style.display='inline'; Codehighlighter1_35_238_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_35_238_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_35_238_Closed_Text.style.display='none'; Codehighlighter1_35_238_Open_Image.style.display='inline'; Codehighlighter1_35_238_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_35_238_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_35_238_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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;foo(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;age,&nbsp;String&nbsp;name)<br />
<img id="Codehighlighter1_77_128_Open_Image" onclick="this.style.display='none'; Codehighlighter1_77_128_Open_Text.style.display='none'; Codehighlighter1_77_128_Closed_Image.style.display='inline'; Codehighlighter1_77_128_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_77_128_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_77_128_Closed_Text.style.display='none'; Codehighlighter1_77_128_Open_Image.style.display='inline'; Codehighlighter1_77_128_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_77_128_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_77_128_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">Inside&nbsp;foo(int,String)</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)<br />
<img id="Codehighlighter1_172_235_Open_Image" onclick="this.style.display='none'; Codehighlighter1_172_235_Open_Text.style.display='none'; Codehighlighter1_172_235_Closed_Image.style.display='inline'; Codehighlighter1_172_235_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_172_235_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_172_235_Closed_Text.style.display='none'; Codehighlighter1_172_235_Open_Image.style.display='inline'; Codehighlighter1_172_235_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_172_235_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_172_235_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyClass&nbsp;myClass&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MyClass();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myClass.foo(</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">zdw</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
HelloWorld.aj:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;aspect&nbsp;HelloWorld<br />
<img id="Codehighlighter1_39_258_Open_Image" onclick="this.style.display='none'; Codehighlighter1_39_258_Open_Text.style.display='none'; Codehighlighter1_39_258_Closed_Image.style.display='inline'; Codehighlighter1_39_258_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_39_258_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_39_258_Closed_Text.style.display='none'; Codehighlighter1_39_258_Open_Image.style.display='inline'; Codehighlighter1_39_258_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span id="Codehighlighter1_39_258_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_39_258_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">切入点</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;pointcut&nbsp;callPointcut()&nbsp;:&nbsp;call(</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;MyClass.foo(</span><span style="color: #0000ff">int</span><span style="color: #000000">,String));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">前置通知</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;before()&nbsp;:&nbsp;callPointcut()<br />
<img id="Codehighlighter1_147_256_Open_Image" onclick="this.style.display='none'; Codehighlighter1_147_256_Open_Text.style.display='none'; Codehighlighter1_147_256_Closed_Image.style.display='inline'; Codehighlighter1_147_256_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_147_256_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_147_256_Closed_Text.style.display='none'; Codehighlighter1_147_256_Open_Image.style.display='inline'; Codehighlighter1_147_256_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_147_256_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_147_256_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">Hello&nbsp;World</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">In&nbsp;the&nbsp;advice&nbsp;attached&nbsp;to&nbsp;the&nbsp;call&nbsp;pointcut</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<img src ="http://www.blogjava.net/supercrsky/aggbug/174381.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/supercrsky/" target="_blank">々上善若水々</a> 2008-01-10 18:04 <a href="http://www.blogjava.net/supercrsky/articles/174381.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Spring进行面向切面编程（AOP）</title><link>http://www.blogjava.net/supercrsky/articles/174368.html</link><dc:creator>々上善若水々</dc:creator><author>々上善若水々</author><pubDate>Thu, 10 Jan 2008 09:40:00 GMT</pubDate><guid>http://www.blogjava.net/supercrsky/articles/174368.html</guid><wfw:comment>http://www.blogjava.net/supercrsky/comments/174368.html</wfw:comment><comments>http://www.blogjava.net/supercrsky/articles/174368.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/supercrsky/comments/commentRss/174368.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/supercrsky/services/trackbacks/174368.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 简介面向切面编程（AOP）提供另外一种角度来思考程序结构，通过这种方式弥补了面向对象编程（OOP）的不足。 除了类（classes）以外，AOP提供了 切面。切面对关注点进行模块化，例如横切多个类型和对象的事务管理。 （这些关注点术语通常称作 横切（crosscutting） 关注点。） Spring的一个关键的组件就是 AOP框架。 尽管如此，Spring IoC容器并不依赖于AOP，这...&nbsp;&nbsp;<a href='http://www.blogjava.net/supercrsky/articles/174368.html'>阅读全文</a><img src ="http://www.blogjava.net/supercrsky/aggbug/174368.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/supercrsky/" target="_blank">々上善若水々</a> 2008-01-10 17:40 <a href="http://www.blogjava.net/supercrsky/articles/174368.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring AOP初探</title><link>http://www.blogjava.net/supercrsky/articles/171909.html</link><dc:creator>々上善若水々</dc:creator><author>々上善若水々</author><pubDate>Mon, 31 Dec 2007 13:48:00 GMT</pubDate><guid>http://www.blogjava.net/supercrsky/articles/171909.html</guid><wfw:comment>http://www.blogjava.net/supercrsky/comments/171909.html</wfw:comment><comments>http://www.blogjava.net/supercrsky/articles/171909.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/supercrsky/comments/commentRss/171909.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/supercrsky/services/trackbacks/171909.html</trackback:ping><description><![CDATA[<span style="font-family: Comic Sans MS"><span class="postbody"><span style="font-size: 12pt">&nbsp;AOP正在成为软件开发的下一个圣杯。使用AOP，你可以将处理aspect的代码注入主程序，通常主程序的主要目的并不在于处理这些aspect。AOP可以防止代码混乱。 <br />
为了理解AOP如何做到这点，考虑一下记日志的工作。日志本身不太可能是你开发的主程序的主要任务。如果能将&#8220;不可见的&#8221;、通用的日志代码注入主程序中，那该多好啊。AOP可以帮助你做到。 <br />
Spring framework是很有前途的AOP技术。作为一种非侵略性的，轻型的AOP framework，你无需使用预编译器或其他的元标签，便可以在Java程序中使用它。这意味着开发团队里只需一人要对付AOP framework，其他人还是象往常一样编程。 <br />
AOP是很多直觉难以理解的术语的根源。幸运的是，你只要理解三个概念，就可以编写AOP模块。这三个概念是：advice，pointcut和 advisor。advice是你想向别的程序内部不同的地方注入的代码。pointcut定义了需要注入advice的位置，通常是某个特定的类的一个 public方法。advisor是pointcut和advice的装配器，是将advice注入主程序中预定义位置的代码。 <br />
<br />
既然我们知道了需要使用advisor向主要代码中注入&#8220;不可见的&#8221;advice，让我们实现一个Spring AOP的例子。在这个例子中，我们将实现一个before advice，这意味着advice的代码在被调用的public方法开始前被执行。以下是这个before advice的实现代码： <br />
<br />
</span></span></span><font size="2"><span class="postbody">
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.company.springaop.test;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.lang.reflect.Method;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.springframework.aop.MethodBeforeAdvice;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_185_376_Open_Image" onclick="this.style.display='none'; Codehighlighter1_185_376_Open_Text.style.display='none'; Codehighlighter1_185_376_Closed_Image.style.display='inline'; Codehighlighter1_185_376_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_185_376_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_185_376_Closed_Text.style.display='none'; Codehighlighter1_185_376_Open_Image.style.display='inline'; Codehighlighter1_185_376_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;TestBeforeAdvice&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;MethodBeforeAdvice&nbsp;</span><span id="Codehighlighter1_185_376_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_185_376_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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;before(Method&nbsp;m,&nbsp;Object[]&nbsp;args,&nbsp;Object&nbsp;target)&nbsp;<br />
<img id="Codehighlighter1_270_373_Open_Image" onclick="this.style.display='none'; Codehighlighter1_270_373_Open_Text.style.display='none'; Codehighlighter1_270_373_Closed_Image.style.display='inline'; Codehighlighter1_270_373_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_270_373_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_270_373_Closed_Text.style.display='none'; Codehighlighter1_270_373_Open_Image.style.display='inline'; Codehighlighter1_270_373_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Throwable&nbsp;</span><span id="Codehighlighter1_270_373_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_270_373_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">Hello&nbsp;world!&nbsp;(by&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.getClass().getName()&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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">);&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">&nbsp;</span></div>
<br />
<br />
<span style="font-family: Comic Sans MS"><span style="font-size: 12pt">接口MethodBeforeAdvice只有一个方法before需要实现，它定义了advice的实现。before方法共用三个参数，它们提供了相当丰富的信息。参数Method m是advice开始后执行的方法。方法名称可以用作判断是否执行代码的条件。Object[] args是传给被调用的public方法的参数数组。当需要记日志时，参数args和被执行方法的名称，都是非常有用的信息。你也可以改变传给m的参数，但要小心使用这个功能；编写最初主程序的程序员并不知道主程序可能会和传入参数的发生冲突。Object target是执行方法m对象的引用。 <br />
<br />
在下面的BeanImpl类中，每个public方法调用前，都会执行advice： <br />
<br />
</span></span></span></font><font size="2"><span class="postbody">
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.company.springaop.test;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_76_276_Open_Image" onclick="this.style.display='none'; Codehighlighter1_76_276_Open_Text.style.display='none'; Codehighlighter1_76_276_Closed_Image.style.display='inline'; Codehighlighter1_76_276_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_76_276_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_76_276_Closed_Text.style.display='none'; Codehighlighter1_76_276_Open_Image.style.display='inline'; Codehighlighter1_76_276_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;BeanImpl&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Bean&nbsp;</span><span id="Codehighlighter1_76_276_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_76_276_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_106_273_Open_Image" onclick="this.style.display='none'; Codehighlighter1_106_273_Open_Text.style.display='none'; Codehighlighter1_106_273_Closed_Image.style.display='inline'; Codehighlighter1_106_273_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_106_273_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_106_273_Closed_Text.style.display='none'; Codehighlighter1_106_273_Open_Image.style.display='inline'; Codehighlighter1_106_273_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&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;theMethod()&nbsp;</span><span id="Codehighlighter1_106_273_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_106_273_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #0000ff">this</span><span style="color: #000000">.getClass().getName()&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Exception().getStackTrace()[</span><span style="color: #000000">0</span><span style="color: #000000">].getMethodName()&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;says&nbsp;HELLO!</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<br />
<br />
<span style="font-family: Comic Sans MS"><span style="font-size: 12pt">类BeanImpl实现了下面的接口Bean： <br />
<br />
</span></span></span></font><font size="2"><span class="postbody">
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.company.springaop.test;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_60_91_Open_Image" onclick="this.style.display='none'; Codehighlighter1_60_91_Open_Text.style.display='none'; Codehighlighter1_60_91_Closed_Image.style.display='inline'; Codehighlighter1_60_91_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_60_91_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_60_91_Closed_Text.style.display='none'; Codehighlighter1_60_91_Open_Image.style.display='inline'; Codehighlighter1_60_91_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;Bean&nbsp;</span><span id="Codehighlighter1_60_91_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_60_91_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&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;theMethod();&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<br />
<br />
<br />
<span style="font-family: Comic Sans MS"><span style="font-size: 12pt">虽然不是必须使用接口，但面向接口而不是面向实现编程是良好的编程实践，Spring也鼓励这样做。 <br />
<br />
pointcut和advice通过配置文件来实现，因此，接下来你只需编写主方法的Java代码： <br />
</span></span></span></font><font size="2"><span class="postbody">
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;com.company.springaop.test;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.springframework.context.ApplicationContext;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.springframework.context.support.FileSystemXmlApplicationContext;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_190_523_Open_Image" onclick="this.style.display='none'; Codehighlighter1_190_523_Open_Text.style.display='none'; Codehighlighter1_190_523_Closed_Image.style.display='inline'; Codehighlighter1_190_523_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_190_523_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_190_523_Closed_Text.style.display='none'; Codehighlighter1_190_523_Open_Image.style.display='inline'; Codehighlighter1_190_523_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Main&nbsp;</span><span id="Codehighlighter1_190_523_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_190_523_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_235_520_Open_Image" onclick="this.style.display='none'; Codehighlighter1_235_520_Open_Text.style.display='none'; Codehighlighter1_235_520_Closed_Image.style.display='inline'; Codehighlighter1_235_520_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_235_520_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_235_520_Closed_Text.style.display='none'; Codehighlighter1_235_520_Open_Image.style.display='inline'; Codehighlighter1_235_520_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span id="Codehighlighter1_235_520_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_235_520_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">Read&nbsp;the&nbsp;configuration&nbsp;file&nbsp;</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;ApplicationContext&nbsp;ctx&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FileSystemXmlApplicationContext(</span><span style="color: #000000">"</span><span style="color: #000000">springconfig.xml</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">Instantiate&nbsp;an&nbsp;object&nbsp;</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;Bean&nbsp;x&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Bean)&nbsp;ctx.getBean(</span><span style="color: #000000">"</span><span style="color: #000000">bean</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">Execute&nbsp;the&nbsp;public&nbsp;method&nbsp;of&nbsp;the&nbsp;bean&nbsp;(the&nbsp;test)&nbsp;</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;x.theMethod();&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<br />
<br />
<br />
<span style="font-family: Comic Sans MS"><span style="font-size: 12pt">我们从读入和处理配置文件开始，接下来马上要创建它。这个配置文件将作为粘合程序不同部分的&#8220;胶水&#8221;。读入和处理配置文件后，我们会得到一个创建工厂ctx。任何一个Spring管理的对象都必须通过这个工厂来创建。对象通过工厂创建后便可正常使用。 <br />
<br />
仅仅用配置文件便可把程序的每一部分组装起来。 <br />
</span></span></span></font><font size="2"><span class="postbody">
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE&nbsp;beans&nbsp;PUBLIC&nbsp;&nbsp;"-//SPRING//DTD&nbsp;BEAN//EN"&nbsp;"http://www.springframework.org/dtd/spring-beans.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">beans</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">CONFIG</span><span style="color: #008000">--&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="bean"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.springframework.aop.framework.ProxyFactoryBean"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="proxyInterfaces"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">com.company.springaop.test.Bean</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="target"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">ref&nbsp;</span><span style="color: #ff0000">local</span><span style="color: #0000ff">="beanTarget"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="interceptorNames"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">list</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">theAdvisor</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">list</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">CLASS</span><span style="color: #008000">--&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="beanTarget"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="com.company.springaop.test.BeanImpl"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">ADVISOR</span><span style="color: #008000">--&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">Note:&nbsp;An&nbsp;advisor&nbsp;assembles&nbsp;pointcut&nbsp;and&nbsp;advice</span><span style="color: #008000">--&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="theAdvisor"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.springframework.aop.support.RegexpMethodPointcutAdvisor"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="advice"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">ref&nbsp;</span><span style="color: #ff0000">local</span><span style="color: #0000ff">="theBeforeAdvice"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="pattern"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">com\.company\.springaop\.test\.Bean\.theMethod</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">ADVICE</span><span style="color: #008000">--&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="theBeforeAdvice"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="com.company.springaop.test.TestBeforeAdvice"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">beans</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;</span></div>
<br />
<br />
<span style="font-family: Comic Sans MS"><span style="font-size: 12pt">四个bean定义的次序并不重要。我们现在有了一个advice，一个包含了正则表达式pointcut的advisor，一个主程序类和一个配置好的接口，通过工厂ctx，这个接口返回自己本身实现的一个引用。 <br />
<br />
BeanImpl和TestBeforeAdvice都是直接配置。我们用一个唯一的ID创建一个bean元素，并指定了一个实现类。这就是全部的工作。 <br />
<br />
advisor通过Spring framework提供的一个RegexMethodPointcutAdvisor类来实现。我们用advisor的一个属性来指定它所需的 advice-bean。第二个属性则用正则表达式定义了pointcut，确保良好的性能和易读性。 <br />
<br />
最后配置的是bean，它可以通过一个工厂来创建。bean的定义看起来比实际上要复杂。bean是ProxyFactoryBean的一个实现，它是Spring framework的一部分。这个bean的行为通过一下的三个属性来定义： <br />
<br />
</span></span>
<ul><br />
    <li><span style="font-family: Comic Sans MS"><span style="font-size: 12pt">属性proxyInterface定义了接口类。 <br />
    </span></span>
    <li><span style="font-family: Comic Sans MS"><span style="font-size: 12pt">属性target指向本地配置的一个bean，这个bean返回一个接口的实现。 <br />
    </span></span>
    <li><span style="font-family: Comic Sans MS"><span style="font-size: 12pt">属性interceptorNames是唯一允许定义一个值列表的属性。这个列表包含所有需要在beanTarget上执行的advisor。注意，advisor列表的次序是非常重要的。 <br />
    </span></span></li>
</ul>
<br />
<br />
<span style="font-family: Comic Sans MS"><span style="font-size: 12pt"><span style="font-weight: bold">Spring工具</span> <br />
<br />
虽然你可以手工修改Ant构建脚本，但使用SpringUI（译注：SpringUI现在是Spring framework的一部分，并改名为spring-ide），使用Spring AOP变得很简单，只要点点鼠标即可。你可以把SpringUI安装成Eclipse的一个plug-in。然后，你只需在你的project上右击鼠标，并选择&#8220;add Spring Project Nature&#8221;。在project属性中，你可以在&#8220;Spring Project&#8221;下添加Spring配置文件。在编译前把下面的类库加入project：aopalliance.jar，commons- logging.jar，jakarta-oro-2.0.7.jar和spring.jar。运行程序时你会看到下面的信息： <br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" />&nbsp;(logging&nbsp;information)&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Hello&nbsp;world!&nbsp;(by&nbsp;com.company.springaop.test.TestBeforeAdvice)&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />com.company.springaop.test.BeanImpl.theMethod()&nbsp;says&nbsp;HELLO!&nbsp;</span></div>
<br />
<br />
<br />
<span style="font-weight: bold">优点和缺点</span> <br />
<br />
Spring比起其他的framework更有优势，因为除了AOP以外，它提供了更多别的功能。作为一个轻型framework，它在J2EE 不同的部分都可以发挥作用。因此，即使不想使用Spring AOP，你可能还是想使用Spring。另一个优点是，Spring并不要求开发团队所有的人员都会用它。学习Spring应该从Spring reference的第一页开始。读了本文后，你应该可以更好地理解Spring reference了。Spring唯一的缺点是缺乏更多的文档，但它的mailing list是个很好的补充，而且会不断地出现更多的文档。</span></span></span></font><span style="font-family: Comic Sans MS"><font size="2">&nbsp;</font><br />
</span>
<img src ="http://www.blogjava.net/supercrsky/aggbug/171909.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/supercrsky/" target="_blank">々上善若水々</a> 2007-12-31 21:48 <a href="http://www.blogjava.net/supercrsky/articles/171909.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>反向控制和面向切面编程在Spring的应用</title><link>http://www.blogjava.net/supercrsky/articles/171903.html</link><dc:creator>々上善若水々</dc:creator><author>々上善若水々</author><pubDate>Mon, 31 Dec 2007 13:40:00 GMT</pubDate><guid>http://www.blogjava.net/supercrsky/articles/171903.html</guid><wfw:comment>http://www.blogjava.net/supercrsky/comments/171903.html</wfw:comment><comments>http://www.blogjava.net/supercrsky/articles/171903.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/supercrsky/comments/commentRss/171903.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/supercrsky/services/trackbacks/171903.html</trackback:ping><description><![CDATA[<span style="font-family: Comic Sans MS"><span style="font-size: 12pt"><strong>引言</strong> <br />
<br />
　　在J2EE的整个发展历程中，现在正是一个非常时刻。从很多方面来说，J2EE都是一个伟大的成功：它成功地在从前没有标准的地方建立了标准；大大提升了企业级软件的开放程度，并且得到了整个行业和开发者的广泛认可。然而，J2EE在一些方面已经开始捉襟见肘。J2EE应用开发的成本通常很高。J2EE应用项目至少和从前的非J2EE项目一样容易失败——如果不是更容易失败的话。这样的失败率高得让人难以接受。在这样的失败率之下，软件开发几乎变成了碰运气。而在J2EE遭遇失败的场景中，EJB通常都扮演着重要的角色。因此，J2EE社群不断地向着更简单的解决方案、更少使用EJB的方向发展<sup>[1]</sup>。然而，每个应用程序都需要一些基础设施，拒绝使用EJB并不意味着拒绝EJB所采用的基础设施解决方案。那么，如何利用现有的框架来提供这些基础设施服务呢，伴随着这个问题的提出，一个轻量级的J2EE解决方案出现了，这就是Spring Framework。<br />
<br />
　　Spring是为简化企业级系统开发而诞生的，Spring框架为J2EE应用常见的问题提供了简单、有效的解决方案，使用Spring，你可以用简单的POJO(Plain Old Java Object)来实现那些以前只有EJB才能实现的功能。这样不只是能简化服务器端开发，任何Java系统开发都能从Spring的简单、可测试和松耦合特征中受益。可以简单的说，Spring是一个轻量级的反向控制（IoC）和面向切面编程（AOP）容器框架<sup>[3]</sup>。Spring IoC，借助于依赖注入设计模式，使得开发者不用理会对象自身的生命周期及其关系，而且能够改善开发者对J2EE模式的使用；Spring AOP，借助于Spring实现的拦截器，开发者能够实现以声明的方式使用企业级服务，比如安全性服务、事务服务等。Spring IoC和 Spring ; AOP组合，一起形成了Spring，这样一个有机整体，使得构建轻量级的J2EE架构成为可能，而且事实证明，非常有效。没有Spring IoC的Spring AOP是不完善的，没有Spring AOP的Spring IoC是不健壮的。本文是以Spring架构的成功的实际商务系统项目为背景，阐述了反向控制原理和面向切面的编程技术在Spring框架中的应用，同时抽取适量代码示意具体应用，并和传统开发模式进行对比，展示了Spring framework的简单，高效，可维护等优点。<br />
<br />
　　<strong>1、Spring IoC 1.1 反向控制原理 </strong><br />
<br />
　　反向控制是Spring框架的核心。但是，反向控制是什么意思？到底控制的什么方面被反向了呢？2004年美国专家Martin Fowler发表了一篇论文《Inversion of Control Containers and the Dependency Injection pattern》阐述了这个问题，他总结说是获得依赖对象的方式反向了，根据这个启示，他还为反向控制提出了一个更贴切的名字：Dependency Injection(DI 依赖注入)。<br />
<br />
　　通常，应用代码需要告知容器或框架,让它们找到自身所需要的类,然后再由应用代码创建待使用的对象实例。因此，应用代码在使用实例之前，需要创建对象实例。然而，IoC模式中,创建对象实例的任务交给IoC容器或框架(实现了IoC设计模式的框架也被称为IoC容器)，使得应用代码只需要直接使用实例，这就是IoC。相对IoC 而言，&#8220;依赖注入&#8221;的确更加准确的描述了这种设计理念。所谓依赖注入，即组件之间的依赖关系由容器在运行期决定，形象的来说，即由容器动态的将某种依赖关系注入到组件之中。<br />
<br />
　　1.2 IoC在Spring中的实现 <br />
<br />
　　任何重要的系统都需要至少两个相互合作的类来完成业务逻辑。通常，每个对象都要自己负责得到它的合作（依赖）对象。你会发现，这样会导致代码耦合度高而且难于测试。使用IoC，对象的依赖都是在对象创建时由负责协调系统中各个对象的外部实体提供的，这样使软件组件松散连接成为可能。下面示意了Spring IoC 应用，步骤如下：<br />
<br />
　　（1）定义Action接口，并为其定义一个execute方法，以完成目标逻辑。多年前，GoF在《Design Pattern：Elements of Reusable Object-Oriented Software》一书中提出&#8220;Programming to an Interface，not an implementation&#8221;的原则，这里首先将业务对象抽象成接口，正是为了实施这个原则。<br />
<br />
　　（2）类UpperAction实现Action接口，在此类中，定义一个String型的域message，并提供相应的setter和getter方法，实现的execute方法如下：<br />
<br />
</span></span>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_35_84_Open_Image" onclick="this.style.display='none'; Codehighlighter1_35_84_Open_Text.style.display='none'; Codehighlighter1_35_84_Closed_Image.style.display='inline'; Codehighlighter1_35_84_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_35_84_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_35_84_Closed_Text.style.display='none'; Codehighlighter1_35_84_Open_Image.style.display='inline'; Codehighlighter1_35_84_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;execute&nbsp;(String&nbsp;str)&nbsp;</span><span id="Codehighlighter1_35_84_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_35_84_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;(getMessage&nbsp;()&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;str).toUpperCase&nbsp;()&nbsp;;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<br />
<span style="font-family: Comic Sans MS"><span style="font-size: 12pt">　　（3）编写Spring配置文件（bean.xml）<br />
<br />
</span></span>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">＜beans＞<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />＜bean&nbsp;id</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">TheAction</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">net.chen.spring.qs.UpperAction</span><span style="color: #000000">"</span><span style="color: #000000">＞<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />＜property&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">message</span><span style="color: #000000">"</span><span style="color: #000000">＞<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />＜value＞HeLLo＜</span><span style="color: #000000">/</span><span style="color: #000000">value＞<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />＜</span><span style="color: #000000">/</span><span style="color: #000000">property＞<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />＜</span><span style="color: #000000">/</span><span style="color: #000000">bean＞<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />＜</span><span style="color: #000000">/</span><span style="color: #000000">beans＞</span></div>
<br />
<span style="font-family: Comic Sans MS"><span style="font-size: 12pt">　　（4）测试代码<br />
<br />
</span></span>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_30_204_Open_Image" onclick="this.style.display='none'; Codehighlighter1_30_204_Open_Text.style.display='none'; Codehighlighter1_30_204_Closed_Image.style.display='inline'; Codehighlighter1_30_204_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_30_204_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_30_204_Closed_Text.style.display='none'; Codehighlighter1_30_204_Open_Image.style.display='inline'; Codehighlighter1_30_204_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;testQuickStart&nbsp;()&nbsp;</span><span id="Codehighlighter1_30_204_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_30_204_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　ApplicationContext&nbsp;ctx</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　FileSystemXmlApplicationContext&nbsp;(</span><span style="color: #000000">"</span><span style="color: #000000">bean.xml</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　Action&nbsp;a</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Action)&nbsp;ctx.getBean&nbsp;(</span><span style="color: #000000">"</span><span style="color: #000000">TheAction</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　System.out.println&nbsp;(a.&nbsp;execute&nbsp;(</span><span style="color: #000000">"</span><span style="color: #000000">Rod&nbsp;Johnson</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<br />
<span style="font-family: Comic Sans MS"><span style="font-size: 12pt">　　上面的测试代码中，我们根据"bean.xml"创建了一个ApplicationContext实例，并从此实例中获取我们所需的Action实现，运行测试代码，我们看到控制台输出：<br />
<br />
</span></span>
<table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e7e9e9" border="1">
    <tbody>
        <tr>
            <td><span style="font-family: Comic Sans MS"><span style="font-size: 12pt">&#8230;&#8230;<br />
            HELLO ROD JOHNSON</span></span></td>
        </tr>
    </tbody>
</table>
<br />
<span style="font-family: Comic Sans MS"><span style="font-size: 12pt">　　仔细观察一下上面的代码，可以看到：<br />
<br />
　　（1）我们的组件并不需要实现框架指定的接口，因此可以轻松的将组件从Spring中脱离，甚至不需要任何修改，这在基于EJB框架实现的应用中是难以想象的。<br />
<br />
　　（2）组件间的依赖关系减少，极大改善了代码的可重用性。Spring的依赖注入机制，可以在运行期为组件配置所需资源，而无需在编写组件代码时就加以指定，从而在相当程度上降低了组件之间的耦合。<br />
<br />
　　Spring给我们带来了如此这般的好处，那么，反过来，让我们试想一下，如果不使用Spring框架，回到我们传统的编码模式，情况会是怎样呢？<br />
<br />
　　首先，我们必须编写一个配置文件读取类，以实现Message属性的可配置化。<br />
<br />
　　其次，得有一个Factory模式的实现，并结合配置文件的读写完成Action的动态加载。于是，我们实现了一个ActionFactory来实现这个功能：<br />
<br />
</span></span>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_27_481_Open_Image" onclick="this.style.display='none'; Codehighlighter1_27_481_Open_Text.style.display='none'; Codehighlighter1_27_481_Closed_Image.style.display='inline'; Codehighlighter1_27_481_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_27_481_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_27_481_Closed_Text.style.display='none'; Codehighlighter1_27_481_Open_Image.style.display='inline'; Codehighlighter1_27_481_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ActionFactory&nbsp;</span><span id="Codehighlighter1_27_481_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_27_481_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_81_480_Open_Image" onclick="this.style.display='none'; Codehighlighter1_81_480_Open_Text.style.display='none'; Codehighlighter1_81_480_Closed_Image.style.display='inline'; Codehighlighter1_81_480_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_81_480_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_81_480_Closed_Text.style.display='none'; Codehighlighter1_81_480_Open_Image.style.display='inline'; Codehighlighter1_81_480_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;Action&nbsp;getAction&nbsp;(String&nbsp;actionName)&nbsp;</span><span id="Codehighlighter1_81_480_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_81_480_Open_Text"><span style="color: #000000">{Properties&nbsp;pro&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Properties&nbsp;();<br />
<img id="Codehighlighter1_123_436_Open_Image" onclick="this.style.display='none'; Codehighlighter1_123_436_Open_Text.style.display='none'; Codehighlighter1_123_436_Closed_Image.style.display='inline'; Codehighlighter1_123_436_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_123_436_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_123_436_Closed_Text.style.display='none'; Codehighlighter1_123_436_Open_Image.style.display='inline'; Codehighlighter1_123_436_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_123_436_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_123_436_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　pro.load&nbsp;(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FileInputStream&nbsp;(</span><span style="color: #000000">"</span><span style="color: #000000">config.properties</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　String&nbsp;actionImplName&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">(String)pro.get(actionName);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　String&nbsp;actionMessage&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">(String)&nbsp;pro.get&nbsp;(actionName</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">_msg</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　Object&nbsp;obj&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">Class.forName&nbsp;(actionImplName).newInstance&nbsp;();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　BeanUtils.setProperty(obj,</span><span style="color: #000000">"</span><span style="color: #000000">message</span><span style="color: #000000">"</span><span style="color: #000000">,actionMessage);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;(Action)&nbsp;obj;<br />
<img id="Codehighlighter1_470_478_Open_Image" onclick="this.style.display='none'; Codehighlighter1_470_478_Open_Text.style.display='none'; Codehighlighter1_470_478_Closed_Image.style.display='inline'; Codehighlighter1_470_478_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_470_478_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_470_478_Closed_Text.style.display='none'; Codehighlighter1_470_478_Open_Image.style.display='inline'; Codehighlighter1_470_478_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(FileNotFoundException&nbsp;e)&nbsp;</span><span id="Codehighlighter1_470_478_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_470_478_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />　　&#8230;&#8230;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />　}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />}</span></span></div>
</span><br />
<span style="font-family: Comic Sans MS"><span style="font-size: 12pt">　　配置文件则采用properties文件形式如下所示：<br />
<br />
</span></span>
<table bordercolor="#cccccc" width="90%" align="center" bgcolor="#e7e9e9" border="1">
    <tbody>
        <tr>
            <td><span style="font-family: Comic Sans MS"><span style="font-size: 12pt">TheAction=net.chen.spring.qs.UpperAction<br />
            TheAction_msg=HeLLo</span></span></td>
        </tr>
    </tbody>
</table>
<br />
<span style="font-family: Comic Sans MS">　　测试代码也作相应修改。现在不论实现的好坏，总之通过上面新增的多行代码，终于实现了类似的功能。如果现在有了一个新的需求，这样这个ActionFactory每次都新建一个类的实例，显然这对系统性能不利，考虑到我们的两个Action都是线程安全的，修改一下ActionFactory，保持系统中只有一个Action实例供其它线程调用。另外Action对象创建后，需要做一些初始化工作。修改一下ActionFactory，使其在创建Action实例之后，随即就调用Action.init方法执行初始化。Action的处理这样就差不多了。下面我们来看看另外一个Factory<br />
<br />
　　&#8230;&#8230;<br />
<br />
　　往往这些系统开发中最常见的需求，会导致我们的代码迅速膨胀，而Spring IoC的出现，则大大缓解了这样的窘境。通过以上实例，可以看出，Spring IoC为我们提供了如下几方面的优势：<br />
<br />
　　（1）应用组件不需要在运行时寻找其协作者，因此更易于开发和编写应用；<br />
<br />
　　（2）由于借助于IoC容器管理组件的依赖关系，使得应用的单元测试和集成测试更利于展开；<br />
<br />
　　（3）通常，在借助于IoC容器关系业务对象的前提下，很少需要使用具体IoC容器提供的API，这使得集成现有的遗留应用成为可能。<br />
<br />
　　因此，通过使用IoC能够降低组件之间的耦合度，最终，能够提高类的重用性，利于测试，而且更利于整个产品或系统集成和配置。<br />
</span>
<img src ="http://www.blogjava.net/supercrsky/aggbug/171903.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/supercrsky/" target="_blank">々上善若水々</a> 2007-12-31 21:40 <a href="http://www.blogjava.net/supercrsky/articles/171903.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring中如何加载多个配置文件</title><link>http://www.blogjava.net/supercrsky/articles/170441.html</link><dc:creator>々上善若水々</dc:creator><author>々上善若水々</author><pubDate>Wed, 26 Dec 2007 00:04:00 GMT</pubDate><guid>http://www.blogjava.net/supercrsky/articles/170441.html</guid><wfw:comment>http://www.blogjava.net/supercrsky/comments/170441.html</wfw:comment><comments>http://www.blogjava.net/supercrsky/articles/170441.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/supercrsky/comments/commentRss/170441.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/supercrsky/services/trackbacks/170441.html</trackback:ping><description><![CDATA[<p><span style="font-family: Comic Sans MS"><span style="font-size: 12pt">Spring加载多个配置文件的方式</span></span></p>
<p><span style="font-family: Comic Sans MS"><span style="font-size: 12pt"><span class="STYLE1">1.第一种，使用数组</span><br />
代码<br />
</span></span></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="font-family: Comic Sans MS"><span style="font-size: 12pt"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">ApplicationContext&nbsp;contex</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ClassXmlApplicationContext(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String[</span><span style="color: #000000">"</span><span style="color: #000000">a1.xml</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">a2.xml</span><span style="color: #000000">"</span><span style="color: #000000">]);&nbsp;</span></span></span></div>
<p><span style="font-family: Comic Sans MS"><br />
</span>&nbsp;</p>
<p><span style="font-family: Comic Sans MS"><span style="font-size: 12pt"><span class="STYLE1">2.第二种，只用通配符</span><br />
代码<br />
</span></span></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="font-family: Comic Sans MS"><span style="font-size: 12pt"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">ApplicationContext&nbsp;contex</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ClassXmlApplicationContext(</span><span style="color: #000000">"</span><span style="color: #000000">a*.xml</span><span style="color: #000000">"</span><span style="color: #000000">);</span></span></span></div>
<p><br />
<span style="font-family: Comic Sans MS"><span style="font-size: 12pt">//但此种方法只对文件系统中的xml文件有效，针对jar包中的无效 <br />
</span></span></p>
<p><span style="font-family: Comic Sans MS"><span style="font-size: 12pt"><span class="STYLE1">3.第三种，引入</span><br />
代码<br />
</span></span></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="font-family: Comic Sans MS"><span style="font-size: 12pt"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">ApplicationContext&nbsp;contex</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ClassXmlApplicationContext(</span><span style="color: #000000">"</span><span style="color: #000000">a1.xml</span><span style="color: #000000">"</span></span></span><span style="color: #000000"><span style="font-family: Comic Sans MS"><span style="font-size: 12pt">);&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></span></span></div>
<p><br />
<span style="font-family: Comic Sans MS"><span style="font-size: 12pt">//在a1.xml中 <br />
<br />
</span></span></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="font-family: Comic Sans MS"><span style="font-size: 12pt"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&lt;</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;resource</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">a2.xml</span><span style="color: #000000">"</span><span style="color: #000000">/&gt;</span><span style="color: #008000">//</span></span></span></div>
<p><span style="font-family: Comic Sans MS"><span style="font-size: 12pt">执行resource路径为相对a1.xml的路径 </span></span></p>
<img src ="http://www.blogjava.net/supercrsky/aggbug/170441.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/supercrsky/" target="_blank">々上善若水々</a> 2007-12-26 08:04 <a href="http://www.blogjava.net/supercrsky/articles/170441.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring AOP学习体会</title><link>http://www.blogjava.net/supercrsky/articles/164589.html</link><dc:creator>々上善若水々</dc:creator><author>々上善若水々</author><pubDate>Sun, 02 Dec 2007 01:03:00 GMT</pubDate><guid>http://www.blogjava.net/supercrsky/articles/164589.html</guid><wfw:comment>http://www.blogjava.net/supercrsky/comments/164589.html</wfw:comment><comments>http://www.blogjava.net/supercrsky/articles/164589.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/supercrsky/comments/commentRss/164589.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/supercrsky/services/trackbacks/164589.html</trackback:ping><description><![CDATA[<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td valign="top" width="359">
            <p><font size="3"><span style="font-family: 宋体"><br />
            </span></font><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: Comic Sans MS">需明确的几个概念:<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
            </span></span></span></span></span><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: Comic Sans MS">1、通知<span style="font-family: 'Courier New'">(Advice)</span></span></span></span></span><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">：用于告知系统将有哪些新的行为。<br />
            2、切入点</span><span style="font-family: 'Courier New'">(Pointcut):</span></span></span></span></span><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">定义了通知应该在应用到那些连接点<br />
            3、目标对象</span><span style="font-family: 'Courier New'">(Target)</span></span></span></span></span><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">：被通知的对象。<br />
            4、</span> <span style="font-family: 宋体">代理</span><span style="font-family: 'Courier New'">(Proxy)</span><span style="font-family: 宋体">：将通知应用到目标对象后创建的对象。</span></span></span></span></span></span></p>
            <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: Comic Sans MS"><span style="font-family: 'Courier New'">Spring</span><span style="font-family: 宋体">有两种代理创建方式：</span><br />
            <br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-family: 'Courier New'">1.</span><span style="font-family: 宋体">如果目标对象实现了一个或多个接口暴露的方法，</span><span style="font-family: 'Courier New'">Spring</span><span style="font-family: 宋体">将使用</span><span style="font-family: 'Courier New'">JDK</span><span style="font-family: 宋体">的</span><span style="font-family: 'Courier New'">java.lang.reflect.Proxy</span><span style="font-family: 宋体">创建代理。这个类让</span><span style="font-family: 'Courier New'">Spring</span><span style="font-family: 宋体">动态产生一个新的类，它实现了所需的接口，织入了通知，并且代理目标的所有请求。（这篇主要介绍这个方式）</span></span></span></span></span></p>
            </td>
        </tr>
        <tr>
            <td colspan="2" height="20">
            <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: Comic Sans MS"><span style="font-family: 'Courier New'">2.</span><span style="font-family: 宋体">如果目标对象没有实现任何接口，<span style="font-family: 'Courier New'">Spring</span><span style="font-family: 宋体">使用</span><span style="font-family: 'Courier New'">CGLIB</span><span style="font-family: 宋体">库生成目标对象的子类。在创建这个子类的时候，</span><span style="font-family: 'Courier New'">Spring</span><span style="font-family: 宋体">将通知织入，并且将对目标对象的调用委托给这个子类。</span></span></span></span></span></span></p>
            <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: Comic Sans MS">&nbsp;<span style="font-family: 宋体">下面以一个实例说明<span style="font-family: 'Courier New'">Spring AOP</span><span style="font-family: 宋体">的基本开发方法：</span></span></span></span></span></span></p>
            <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: Comic Sans MS"><span style="font-family: 'Courier New'">一．</span><span style="font-family: 宋体">创建通知</span></span></span></span></span></p>
            <p><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">Spring连接点模型是建立在方法拦截上，这意味着你编写的Spring通知会在方法调用周围的各个地方织入系统中。</span></span></span></span></p>
            <p><span style="font-family: 宋体"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><img height="191" alt="" src="http://www.java3z.com/cwbwebhome/article/article2/img5/Im665.gif" width="663" twffan="done" /></span></span></span></span></p>
            <p align="center"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">图</span><span style="font-family: 'Courier New'">1</span></span></span></span></p>
            <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;TestAopServiceAdvice</span><span style="font-family: 宋体">实现了接口</span><span style="font-family: 'Courier New'">MethodBeforeAdvice(</span><span style="font-family: 宋体">前置通知</span><span style="font-family: 'Courier New'">)</span><span style="font-family: 宋体">，并实现它的惟一的方法</span><span style="font-family: 'Courier New'">before</span><span style="font-family: 宋体">，这个类就可以在调用目标对象前被调用。同样的还有</span><span style="font-family: 'Courier New'">AfterReturningAdvice(</span><span style="font-family: 宋体">后置通知</span><span style="font-family: 'Courier New'">)</span><span style="font-family: 宋体">，</span><span style="font-family: 'Courier New'">MethodInterceptor(</span><span style="font-family: 宋体">环绕通知</span><span style="font-family: 'Courier New'">)</span><span style="font-family: 宋体">，异常通知</span><span style="font-family: 'Courier New'">(ThrowsAdvice)</span><span style="font-family: 宋体">，引入通知等。</span></span></span></span></p>
            <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;在这个方法中我们输出了一个字符串</span><span style="font-family: 'Courier New'">TestAopServiceAdvice</span><span style="font-family: 宋体">，用于验证这个方法是否在目标对象前调用了。</span></span></span></span></p>
            <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="color: red; font-family: 宋体">注意：</span><span style="font-family: 宋体">我们无法改变</span><span style="font-family: 'Courier New'">before</span><span style="font-family: 宋体">方法中的参数</span><span style="font-family: 'Courier New'">args</span><span style="font-family: 宋体">和</span><span style="font-family: 'Courier New'">target</span><span style="font-family: 宋体">中的值，</span><span style="font-family: 'Courier New'">args</span><span style="font-family: 宋体">中存的是原来要传入目标对象的变量，</span><span style="font-family: 'Courier New'">target</span><span style="font-family: 宋体">即指目标对象。</span></span></span></span></p>
            <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">&nbsp;<span style="font-family: 'Courier New'">二．<span style="font-family: 宋体">配置</span><span style="font-family: 'Courier New'">Spring XML</span><span style="font-family: 宋体">配置文件</span></span></span></span></span></p>
            <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">要在</span><span style="font-family: 'Courier New'">Spring</span><span style="font-family: 宋体">中实现</span><span style="font-family: 'Courier New'">AOP</span><span style="font-family: 宋体">，一般情况下需要配置</span><span style="font-family: 'Courier New'">4</span><span style="font-family: 宋体">个</span><span style="font-family: 'Courier New'">bean</span><span style="font-family: 宋体">：</span></span></span></span></p>
            <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 'Courier New'">1．</span><span style="font-family: 宋体">目标对象（</span><span style="font-family: 'Courier New'">target</span><span style="font-family: 宋体">）</span></span></span></span></p>
            <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 'Courier New'">2．</span><span style="font-family: 宋体">通知</span><span style="font-family: 'Courier New'">(advice)</span></span></span></span></p>
            <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 'Courier New'">3．</span><span style="font-family: 宋体">切入点</span><span style="font-family: 'Courier New'">(pointcut)</span></span></span></span></p>
            <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 'Courier New'">4．</span><span style="font-family: 宋体">代理</span><span style="font-family: 'Courier New'">(proxy)</span></span></span></span></p>
            <p><span style="font-family: 'Courier New'"><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><img height="352" alt="" src="http://www.java3z.com/cwbwebhome/article/article2/img5/Im666.gif" width="700" twffan="done" /></span></span></span></span></p>
            <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">图</span><span style="font-family: 'Courier New'">2</span></span></span></span></p>
            <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">切入点又分为静态切入点和动态切入点<br />
            1、</span><span style="font-family: Wingdings">&nbsp;</span><span style="font-family: 宋体">静态切入点的意思是通知总是被执行</span><span style="font-family: 'Courier New'">,</span></span></span></span><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">也是最常用的一种切入点。<br />
            2、</span><span style="font-family: Wingdings"><span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span><span style="font-family: 宋体">动态切入点根据运行时方法的参数值决定通知是否被执行。</span></span></span></span></p>
            <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">在图</span><span style="font-family: 'Courier New'">2</span><span style="font-family: 宋体">中，定义了使用了一个</span><span style="font-family: 'Courier New'">Spring</span><span style="font-family: 宋体">提供的静态切入点</span></span></span></span></p>
            <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;NameMatchMethodPointAdvisor</span><span style="font-family: 宋体">，它保证了当被调用的方法的名字与给出的映射名字相匹配的时候，这个切入点才匹配。</span></span></span></span></p>
            <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;Spring</span><span style="font-family: 宋体">提供的另一个静态切入点为</span><span style="font-family: 'Courier New'">RegexpMethodPointcutAdvisor</span><span style="font-family: 宋体">，让你可以利用正则表达式来定义切入点</span><span style="font-family: 宋体">.</span></span></span></span></p>
            <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS">&nbsp;<span style="font-family: 宋体">使用</span><span style="font-family: 'Courier New'">ProxyBeanFactory</span><span style="font-family: 宋体">可以创建一个被通知的类，即代理对象。它的最常用的</span><span style="font-family: 宋体">二</span><span style="font-family: 宋体">个控制行为的属性是</span></span></span></span><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">:<br />
            1、</span><span style="font-family: 'Courier New'">proxyInterfaces</span></span></span></span><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="font-family: 宋体">：代理应该实现的接口列表<br />
            2、</span><span style="font-family: 'Courier New'">interceptorNames</span><span style="font-family: 宋体">：需要应用到目标对象上的通知</span><span style="font-family: 'Courier New'">Bean</span><span style="font-family: 宋体">的名字。可以是拦截器、</span><span style="font-family: 'Courier New'">Advisor</span><span style="font-family: 宋体">或其他通知类的名字。</span></span></span></span></p>
            <p><span style="font-size: 10pt"><span style="font-size: 12pt"><span style="font-family: Comic Sans MS"><span style="color: red; font-family: 宋体">注：在用容器的</span><span style="color: red; font-family: 'Courier New'">getBean</span><span style="color: red; font-family: 宋体">方法时，应该是</span><span style="color: red; font-family: 'Courier New'">getBean(</span><span style="color: red; font-family: 宋体">代理类的名字</span><span style="color: red; font-family: 'Courier New'">)</span><span style="color: red; font-family: 宋体">，而不是</span><span style="color: red; font-family: 'Courier New'">getBean(</span><span style="color: red; font-family: 宋体">目标对象的名字</span><span style="color: red; font-family: 'Courier New'">)</span><span style="color: red; font-family: 宋体">，否则</span><span style="color: red; font-family: 'Courier New'">AOP</span><span style="color: red; font-family: 宋体">无法工作。</span></span></span></span></p>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/supercrsky/aggbug/164589.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/supercrsky/" target="_blank">々上善若水々</a> 2007-12-02 09:03 <a href="http://www.blogjava.net/supercrsky/articles/164589.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring中bean的作用域</title><link>http://www.blogjava.net/supercrsky/articles/162778.html</link><dc:creator>々上善若水々</dc:creator><author>々上善若水々</author><pubDate>Sat, 24 Nov 2007 00:55:00 GMT</pubDate><guid>http://www.blogjava.net/supercrsky/articles/162778.html</guid><wfw:comment>http://www.blogjava.net/supercrsky/comments/162778.html</wfw:comment><comments>http://www.blogjava.net/supercrsky/articles/162778.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/supercrsky/comments/commentRss/162778.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/supercrsky/services/trackbacks/162778.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt"><span style="font-size: 14pt"><span style="font-size: 14pt">如何使用spring的作用域：<br />
<span style="color: teal">&lt;</span><span style="color: #3f7f7f">bean </span><span style="color: #7f007f">id</span><span style="color: black">=</span><span style="color: #2a00ff">"role" </span><span style="color: #7f007f">class</span><span style="color: black">=</span><span style="color: #2a00ff">"spring.chapter2.maryGame.Role" </span><span style="color: #7f007f">scope=</span><span style="color: #2a00ff">"singleton"/</span><span style="color: teal">&gt;</span></span><span style="color: black"><br />
<span style="font-size: 14pt">这里的</span></span><span style="font-size: 14pt"><span style="color: black">scope</span><span style="color: black">就是用来配置</span><span style="color: black">spring bean</span><span style="color: black">的作用域，它标识</span><span style="color: black">bean</span><span style="color: black">的作用域。</span><br />
</span></span></span><br />
<span style="font-size: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在<span>spring2.0之前bean只有2种作用域即：singleton(单例)、non-singleton（也称prototype）, Spring2.0以后，增加了session、request、global session三种专用于Web应用程序上下文的Bean。因此，默认情况下Spring2.0现在有五种类型的Bean。当然，Spring2.0对Bean的类型的设计进行了重构，并设计出灵活的Bean类型支持，理论上可以有无数多种类型的Bean，用户可以根据自己的需要，增加新的Bean类型，满足实际应用需求。</span><br />
<strong><font color="#0000ff"><span>1、singleton</span><span style="font-size: 10pt">作用域<br />
</span></font></strong>当一个<span>bean的</span><span style="font-size: 10pt">作用域</span>设置为<span>singleton, 那么Spring IOC容器中只会存在一个共享的bean实例，并且所有对bean的请求，只要id与该bean定义相匹配，则只会返回bean的同一实例。换言之，当把一个bean定义设置为singleton作用域时，Spring IOC容器只会创建该bean定义的唯一实例。这个单一实例会被存储到单例缓存（singleton cache）中，并且所有针对该<span>bean的后续请求和引用</span>都将返回被缓存的对象实例，这里要注意的是singleton作用域和GOF设计模式中的单例是完全不同的，单例设计模式表示一个ClassLoader中只有一个class存在，而这里的singleton则表示一个容器对应一个bean，也就是说当一个bean被标识为singleton时候，spring的IOC容器中只会存在一个该bean。</span><br />
<br />
配置实例：<br />
<span style="font-size: 10pt; color: teal">&lt;</span><span style="font-size: 10pt; color: #3f7f7f">bean </span><span style="font-size: 10pt; color: #7f007f">id</span><span style="font-size: 10pt; color: black">=</span><span style="font-size: 10pt; color: #2a00ff">"role" </span><span style="font-size: 10pt; color: #7f007f">class</span><span style="font-size: 10pt; color: black">=</span><span style="font-size: 10pt; color: #2a00ff">"spring.chapter2.maryGame.Role" </span><span style="font-size: 10pt; color: #7f007f">scope=</span><span style="font-size: 10pt; color: #2a00ff">"singleton"/</span><span style="font-size: 10pt; color: teal">&gt; </span><span style="font-size: 10pt; color: teal">或者</span><span style="font-size: 10pt; color: teal">&lt;</span><span style="font-size: 10pt; color: #3f7f7f">bean </span><span style="font-size: 10pt; color: #7f007f">id</span><span style="font-size: 10pt; color: black">=</span><span style="font-size: 10pt; color: #2a00ff">"role" </span><span style="font-size: 10pt; color: #7f007f">class</span><span style="font-size: 10pt; color: black">=</span><span style="font-size: 10pt; color: #2a00ff">"spring.chapter2.maryGame.Role" </span><span style="font-size: 10pt; color: #7f007f">singleton=</span><span style="font-size: 10pt; color: #2a00ff">"true"/</span><span style="font-size: 10pt; color: teal">&gt;</span><br />
<br />
<span><strong><font color="#0000ff">2、prototype</font></strong></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
prototype作用域部署的bean，每一次请求（将其注入到另一个bean中，或者以程序的方式调用容器的<code><span style="font-size: 12pt">getBean()</span></code>方法）都会产生一个新的bean实例，相当一个new的操作，对于prototype作用域的bean，有一点非常重要，那就是Spring不能对一个prototype bean的整个生命周期负责，容器在初始化、配置、装饰或者是装配完一个<span>prototype实例后，将它交给客户端，随后就对该prototype实例不闻不问了。不管何种作用域，容器都会调用所有对象的初始化生命周期回调方法，而对prototype而言，任何配置好的析构生命周期回调方法都将不会被调用</span>。清除prototype作用域的对象并释放任何prototype bean所持有的昂贵资源，都是客户端代码的职责。（让Spring容器释放被singleton作用域bean占用资源的一种可行方式是，通过使用bean的后置处理器，该处理器持有要被清除的bean的引用。）<br />
配置实例：<br />
<span style="font-size: 10pt; color: teal">&lt;</span><span style="font-size: 10pt; color: #3f7f7f">bean </span><span style="font-size: 10pt; color: #7f007f">id</span><span style="font-size: 10pt; color: black">=</span><span style="font-size: 10pt; color: #2a00ff">"role" </span><span style="font-size: 10pt; color: #7f007f">class</span><span style="font-size: 10pt; color: black">=</span><span style="font-size: 10pt; color: #2a00ff">"spring.chapter2.maryGame.Role" </span><span style="font-size: 10pt; color: #7f007f">scope=</span><span style="font-size: 10pt; color: #2a00ff">"prototype"/</span></span><span style="font-size: 14pt"><span style="font-size: 10pt; color: teal">&gt;<br />
</span>或者<span style="font-size: 10pt; color: teal">&lt;</span><span style="font-size: 10pt; color: #7f007f">bean</span><span style="font-size: 10pt; color: #7f007f">id</span><span style="font-size: 10pt; color: black">=</span><span style="font-size: 10pt; color: #2a00ff">"role" </span><span style="font-size: 10pt; color: #7f007f">class</span><span style="font-size: 10pt; color: black">=</span><span style="font-size: 10pt; color: #2a00ff">"spring.chapter2.maryGame.Role" </span><span style="font-size: 10pt; color: #7f007f">singleton=</span><span style="font-size: 10pt; color: #2a00ff">"false"/</span><span style="font-size: 10pt; color: teal">&gt;</span>&nbsp;3、request &nbsp;&nbsp;&nbsp;request表示该针对每一次<span>HTTP请求都会产生一个新的bean，同时该bean仅在当前HTTP request内有效。</span>request、<span>session、global session使用的时候首先要在web.xml中做如下配置：</span><br />
&nbsp;&nbsp;&nbsp;&nbsp; 如果你使用的是<span>Servlet 2.4及以上的web容器，那么你仅需要在web应用的XML声明文件</span>web.xml中增加下述ContextListener即可：<br />
</span>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 95%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><span style="font-size: 14pt"><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">web-app</span><span style="color: #0000ff">&gt;</span></span><span style="color: #000000"><br />
<span style="font-size: 14pt">&nbsp;&nbsp;...<br />
&nbsp;&nbsp;</span></span><span style="font-size: 14pt"><span style="color: #0000ff">&lt;</span><span style="color: #800000">listener</span><span style="color: #0000ff">&gt;</span></span><span style="color: #000000"><br />
</span><span style="font-size: 14pt"><span style="color: #0000ff">&lt;</span><span style="color: #800000">listener-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">org.springframework.web.context.request.RequestContextListener</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">listener-class</span><span style="color: #0000ff">&gt;</span></span><span style="color: #000000"><br />
<span style="font-size: 14pt">&nbsp;&nbsp;</span></span><span style="font-size: 14pt"><span style="color: #0000ff">&lt;/</span><span style="color: #800000">listener</span><span style="color: #0000ff">&gt;</span></span><span style="color: #000000"><br />
<span style="font-size: 14pt">&nbsp;&nbsp;...<br />
</span></span><span style="font-size: 14pt"><span style="color: #0000ff">&lt;/</span><span style="color: #800000">web-app</span><span style="color: #0000ff">&gt;</span></span><span style="color: #000000"><br />
</span></div>
</div>
<br />
<span style="font-size: 14pt">，如果是Servlet2.4以前的web容器,那么你要使用一个javax.servlet.Filter的实现：</span>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 95%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><span style="font-size: 14pt"><span style="color: #0000ff">&lt;</span><span style="color: #800000">web-app</span><span style="color: #0000ff">&gt;</span></span><span style="color: #000000"><br />
<span style="font-size: 14pt">&nbsp;..<br />
&nbsp;</span></span><span style="font-size: 14pt"><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span></span><span style="font-size: 14pt"><span style="color: #000000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">requestContextFilter</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span></span><span style="font-size: 14pt"><span style="color: #000000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">org.springframework.web.filter.RequestContextFilter</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">&gt;</span></span><span style="color: #000000"><br />
<span style="font-size: 14pt">&nbsp;</span></span><span style="font-size: 14pt"><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span></span><span style="font-size: 14pt"><span style="color: #000000">&nbsp;<br />
&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span></span><span style="font-size: 14pt"><span style="color: #000000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">requestContextFilter</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span></span><span style="font-size: 14pt"><span style="color: #000000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/*</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span></span><span style="color: #000000"><br />
<span style="font-size: 14pt">&nbsp;</span></span><span style="font-size: 14pt"><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span></span><span style="color: #000000"><br />
<span style="font-size: 14pt">&nbsp;&nbsp;...<br />
</span></span><span style="font-size: 14pt"><span style="color: #0000ff">&lt;/</span><span style="color: #800000">web-app</span><span style="color: #0000ff">&gt;</span></span><span style="color: #000000"><br />
</span></div>
</div>
<br />
<span style="font-size: 14pt">接着既可以配置</span><span style="font-size: 14pt"><span>bean的作用域了：<br />
</span><span style="font-size: 10pt; color: teal">&lt;</span><span style="font-size: 10pt; color: #3f7f7f">bean </span><span style="font-size: 10pt; color: #7f007f">id</span><span style="font-size: 10pt; color: black">=</span><span style="font-size: 10pt; color: #2a00ff">"role" </span><span style="font-size: 10pt; color: #7f007f">class</span><span style="font-size: 10pt; color: black">=</span><span style="font-size: 10pt; color: #2a00ff">"spring.chapter2.maryGame.Role" </span><span style="font-size: 10pt; color: #7f007f">scope=</span><span style="font-size: 10pt; color: #2a00ff">"request"/</span><span style="font-size: 10pt; color: teal">&gt;</span><br />
<br />
<span><strong><font color="#0000ff">4、session</font></strong></span>&nbsp;&nbsp;&nbsp;&nbsp;<br />
session作用域表示该针对每一次<span>HTTP请求都会产生一个新的bean，同时该bean仅在当前HTTP session内有效，配置实例：</span>配置实例：和request配置实例的前提一样，配置好web启动文件就可以如下配置：<span style="font-size: 10pt; color: teal">&lt;</span><span style="font-size: 10pt; color: #3f7f7f">bean </span><span style="font-size: 10pt; color: #7f007f">id</span><span style="font-size: 10pt; color: black">=</span><span style="font-size: 10pt; color: #2a00ff">"role" </span><span style="font-size: 10pt; color: #7f007f">class</span><span style="font-size: 10pt; color: black">=</span><span style="font-size: 10pt; color: #2a00ff">"spring.chapter2.maryGame.Role" </span><span style="font-size: 10pt; color: #7f007f">scope=</span><span style="font-size: 10pt; color: #2a00ff">"session"/</span><span style="font-size: 10pt; color: teal">&gt;</span><br />
<br />
<span><strong><font color="#0000ff">5、global session</font></strong></span>&nbsp;&nbsp;&nbsp;&nbsp;<br />
global session作用域类似于标准的<span>HTTP Session作用域，不过它仅仅在基于portlet的web应用中才有意义。Portlet规范定义了全局Session的概念，它被所有构成某个portlet web应用的各种不同的portlet所共享。在global session作用域中定义的bean被限定于全局portlet Session的生命周期范围内。如果你在web中使用global session作用域来标识bean，那么web会自动当成session类型来使用。</span>配置实例：和request配置实例的前提一样，配置好web启动文件就可以如下配置：<br />
<span style="font-size: 10pt; color: teal">&lt;</span><span style="font-size: 10pt; color: #3f7f7f">bean </span><span style="font-size: 10pt; color: #7f007f">id</span><span style="font-size: 10pt; color: black">=</span><span style="font-size: 10pt; color: #2a00ff">"role" </span><span style="font-size: 10pt; color: #7f007f">class</span><span style="font-size: 10pt; color: black">=</span><span style="font-size: 10pt; color: #2a00ff">"spring.chapter2.maryGame.Role" </span><span style="font-size: 10pt; color: #7f007f">scope=</span><span style="font-size: 10pt; color: #2a00ff">"global session"/</span><span style="font-size: 10pt; color: teal">&gt;</span><br />
<br />
<span><strong><font color="#0000ff">6、自定义bean装配作用域</font></strong></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
在spring2.0中作用域是可以任意扩展的，你可以自定义作用域，甚至你也可以重新定义已有的作用域（但是你不能覆盖singleton和prototype），spring的作用域由接口org.springframework.beans.factory.config.Scope来定义，自定义自己的作用域只要实现该接口即可，下面给个实例：我们建立一个线程的scope，该scope在表示一个线程中有效，代码如下：<br />
</span>
<div><span style="font-size: 14pt"><span style="color: #000000">publicclass&nbsp;MyScope&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Scope&nbsp;</span></span><span><span style="font-size: 14pt"><span style="color: #000000">{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;privatefinal&nbsp;ThreadLocal&nbsp;threadScope&nbsp;=&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ThreadLocal()&nbsp;</span></span><span><span style="font-size: 14pt"><span style="color: #000000">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;Object&nbsp;initialValue()</span></span><span><span style="color: #000000"><span style="font-size: 14pt">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;returnnew&nbsp;HashMap();&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></span><span style="color: #000000"><span style="font-size: 14pt">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></span><span style="font-size: 14pt"><span style="color: #000000">;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Object&nbsp;get(String&nbsp;name,&nbsp;ObjectFactory&nbsp;objectFactory)&nbsp;</span></span><span><span style="font-size: 14pt"><span style="color: #000000">{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map&nbsp;scope&nbsp;=&nbsp;(Map)&nbsp;threadScope.get();&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;object&nbsp;=&nbsp;scope.get(name);&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(object==</span><span style="color: #0000ff">null</span><span style="color: #000000">)</span></span><span><span style="color: #000000"><span style="font-size: 14pt">{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;object&nbsp;=&nbsp;objectFactory.getObject();&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scope.put(name,&nbsp;object);&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></span><span style="font-size: 14pt"><span style="color: #000000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span></span><span style="color: #000000"><span style="font-size: 14pt">&nbsp;object;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></span><span style="font-size: 14pt"><span style="color: #000000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Object&nbsp;remove(String&nbsp;name)</span></span><span><span style="font-size: 14pt"><span style="color: #000000">{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map&nbsp;scope&nbsp;=&nbsp;(Map)&nbsp;threadScope.get();&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span></span><span style="color: #000000"><span style="font-size: 14pt">&nbsp;scope.remove(name);&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></span><span style="color: #000000"><br />
<span style="font-size: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;publicvoid&nbsp;registerDestructionCallback(String&nbsp;name,&nbsp;Runnable&nbsp;callback)&nbsp;</span></span><span><span style="color: #000000"><span style="font-size: 14pt">{&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></span><span style="color: #000000"><br />
<span style="font-size: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="font-size: 14pt"><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;String&nbsp;getConversationId()&nbsp;</span></span><span><span style="color: #000000"><span style="font-size: 14pt">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="color: #008000"><span style="font-size: 14pt">//&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub<br />
</span></span><span style="color: #000000"><span style="font-size: 14pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;returnnull;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></span><span style="color: #000000"><span style="font-size: 14pt">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></span></div>
<img src ="http://www.blogjava.net/supercrsky/aggbug/162778.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/supercrsky/" target="_blank">々上善若水々</a> 2007-11-24 08:55 <a href="http://www.blogjava.net/supercrsky/articles/162778.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>