﻿<?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-zhangxl_blog-文章分类-Spring</title><link>http://www.blogjava.net/zhanglongsr/category/12017.html</link><description>路漫漫其修远兮，吾将上下而求索！</description><language>zh-cn</language><lastBuildDate>Mon, 30 Jan 2012 14:43:44 GMT</lastBuildDate><pubDate>Mon, 30 Jan 2012 14:43:44 GMT</pubDate><ttl>60</ttl><item><title>Spring 源码阅读(IOC容器)-bean的实例化以及注入</title><link>http://www.blogjava.net/zhanglongsr/articles/369029.html</link><dc:creator>zhangxl</dc:creator><author>zhangxl</author><pubDate>Mon, 30 Jan 2012 08:04:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglongsr/articles/369029.html</guid><wfw:comment>http://www.blogjava.net/zhanglongsr/comments/369029.html</wfw:comment><comments>http://www.blogjava.net/zhanglongsr/articles/369029.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglongsr/comments/commentRss/369029.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglongsr/services/trackbacks/369029.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 3.Bean的实例化以及注入过程分析&nbsp;&nbsp;&nbsp;&nbsp;Bean的实例以及注入是在getBean时触发的，由于外部容器是与外部调用交互的桥梁，我们首先从外部容器入手，AbstractApplicationContext类实现了getBean方法，代码如下： Code highlighting produced by Actipro CodeHighlighter (...&nbsp;&nbsp;<a href='http://www.blogjava.net/zhanglongsr/articles/369029.html'>阅读全文</a><img src ="http://www.blogjava.net/zhanglongsr/aggbug/369029.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglongsr/" target="_blank">zhangxl</a> 2012-01-30 16:04 <a href="http://www.blogjava.net/zhanglongsr/articles/369029.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring 源码阅读(IOC容器)-容器启动2</title><link>http://www.blogjava.net/zhanglongsr/articles/369019.html</link><dc:creator>zhangxl</dc:creator><author>zhangxl</author><pubDate>Mon, 30 Jan 2012 06:24:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglongsr/articles/369019.html</guid><wfw:comment>http://www.blogjava.net/zhanglongsr/comments/369019.html</wfw:comment><comments>http://www.blogjava.net/zhanglongsr/articles/369019.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglongsr/comments/commentRss/369019.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglongsr/services/trackbacks/369019.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 2.2.3 资源定位、解释2.2.3.1 资源定位加载与容器的关系&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loadBeanDefinitions方法主要是加载BeanDefinition，而BeanDefinition的定义是来自于一组资源的，要加载BeanDefinition，Spring首先要加载、解释这些资源，资源的定位、加载由ResourceLoader与Resourc...&nbsp;&nbsp;<a href='http://www.blogjava.net/zhanglongsr/articles/369019.html'>阅读全文</a><img src ="http://www.blogjava.net/zhanglongsr/aggbug/369019.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglongsr/" target="_blank">zhangxl</a> 2012-01-30 14:24 <a href="http://www.blogjava.net/zhanglongsr/articles/369019.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring 源码阅读(IOC容器)-容器启动1</title><link>http://www.blogjava.net/zhanglongsr/articles/365591.html</link><dc:creator>zhangxl</dc:creator><author>zhangxl</author><pubDate>Mon, 05 Dec 2011 06:46:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglongsr/articles/365591.html</guid><wfw:comment>http://www.blogjava.net/zhanglongsr/comments/365591.html</wfw:comment><comments>http://www.blogjava.net/zhanglongsr/articles/365591.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglongsr/comments/commentRss/365591.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglongsr/services/trackbacks/365591.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp;&nbsp;我们知道Spring框架提供基于依赖注入的IOC容器，完成对象的构造、依赖注入、对象声明周期维护等功能，下面将以FileSystemXmlApplicationContext为例来分析Spring IOC容器的实现。1.容器类图&nbsp;&nbsp;&nbsp;&nbsp;从整体上看Spring容器可以分为两大部分：外部容器和内部容器。我们经常使用...&nbsp;&nbsp;<a href='http://www.blogjava.net/zhanglongsr/articles/365591.html'>阅读全文</a><img src ="http://www.blogjava.net/zhanglongsr/aggbug/365591.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglongsr/" target="_blank">zhangxl</a> 2011-12-05 14:46 <a href="http://www.blogjava.net/zhanglongsr/articles/365591.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一篇很生动的IOC讲解文章</title><link>http://www.blogjava.net/zhanglongsr/articles/348680.html</link><dc:creator>zhangxl</dc:creator><author>zhangxl</author><pubDate>Thu, 21 Apr 2011 02:13:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglongsr/articles/348680.html</guid><wfw:comment>http://www.blogjava.net/zhanglongsr/comments/348680.html</wfw:comment><comments>http://www.blogjava.net/zhanglongsr/articles/348680.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglongsr/comments/commentRss/348680.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglongsr/services/trackbacks/348680.html</trackback:ping><description><![CDATA[<p class="MsoNormal"><strong><span style="color: #333399; font-family: 宋体;">一、什么是</span></strong><strong><span style="color: #333399; font-family: 'Courier New';" lang="EN-US">IOC</span></strong></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 'Courier New';" lang="EN-GB">IoC</span><span style="font-family: 宋体;">就是</span><span style="font-family: 'Courier New';" lang="EN-GB">Inversion of Control</span><span style="font-family: 宋体;">，控制反转。在</span><span style="font-family: 'Courier New';" lang="EN-GB">Java</span><span style="font-family: 宋体;">开发中，</span><span style="font-family: 'Courier New';" lang="EN-GB">IoC</span><span style="font-family: 宋体;">意味着将你设计好的类交给系统去控制，而不是在你的类内部控制。这称为控制反转。</span></p>
<p class="MsoNormal" style="text-indent: 21pt;">&nbsp;</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">下面我们以几个例子来说明什么是</span><span style="font-family: 'Courier New';" lang="EN-GB">IoC</span></p>
<p class="MsoNormal" style="text-indent: 21pt;">&nbsp;</p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">假设我们要设计一个</span><span style="font-family: 'Courier New';" lang="EN-GB">Girl</span><span style="font-family: 宋体;">和一个</span><span style="font-family: 'Courier New';" lang="EN-GB">Boy</span><span style="font-family: 宋体;">类，其中</span><span style="font-family: 'Courier New';" lang="EN-GB">Girl</span><span style="font-family: 宋体;">有</span><span style="font-family: 'Courier New';" lang="EN-GB">kiss</span><span style="font-family: 宋体;">方法，即</span><span style="font-family: 'Courier New';" lang="EN-GB">Girl</span><span style="font-family: 宋体;">想要</span><span style="font-family: 'Courier New';" lang="EN-GB">Kiss</span><span style="font-family: 宋体;">一个</span><span style="font-family: 'Courier New';" lang="EN-GB">Boy</span><span style="font-family: 宋体;">。那么，我们的问题是，</span><span style="font-family: 'Courier New';" lang="EN-GB">Girl</span><span style="font-family: 宋体;">如何能够认识这个</span><span style="font-family: 'Courier New';" lang="EN-GB">Boy</span><span style="font-family: 宋体;">？</span></p>
<p class="MsoNormal" style="text-align: center;" align="center"></p>
<p class="MsoNormal" align="center"><span style="font-family: 'Courier New';" lang="EN-US"><img alt="" src="/Develop/ArticleImages/24/24397/CSDN_Dev_Image_2004-2-16115390.gif" align="baseline" border="0" hspace="0" /></span></p>
<p class="MsoNormal"><span style="font-family: 'Courier New';" lang="EN-US">&nbsp;&nbsp;&nbsp;
</span><span style="font-family: 宋体;">在我们中国，常见的ＭＭ与</span><span style="font-family: 'Courier New';" lang="EN-US">GG</span><span style="font-family: 宋体;">的认识方式有以下几种</span></p>
<p class="MsoNormal"><span style="font-family: 'Courier New';" lang="EN-US">&nbsp;&nbsp;&nbsp;
</span><span style="font-family: 宋体;">１　青梅竹马；</span><span style="font-family: 'Courier New';" lang="EN-US">&nbsp; </span><span style="font-family: 宋体;">２　亲友介绍；</span><span style="font-family: 'Courier New';" lang="EN-US">&nbsp; </span><span style="font-family: 宋体;">３　父母包办</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><span style="font-family: 'Courier New';" lang="EN-US">&nbsp;&nbsp;&nbsp;
</span><span style="font-family: 宋体;">那么哪一种才是最好呢？</span></p>
<p class="MsoNormal"><span style="font-family: 'Courier New';" lang="EN-US">&nbsp;&nbsp;&nbsp;
</span><strong><span style="color: #333399; font-family: 宋体;">青梅竹马</span></strong><span style="font-family: 宋体;">：</span><span style="font-family: 'Courier New';" lang="EN-US">Girl</span><span style="font-family: 宋体;">从小就知道自己的</span><span style="font-family: 'Courier New';" lang="EN-US">Boy</span><span style="font-family: 宋体;">。</span></p>
<p class="MsoNormal"><span style="font-family: 'Courier New';" lang="EN-US">&nbsp;&nbsp;&nbsp;
</span></p>
<p class="MsoNormal" style="text-align: center;" align="center"></p>
<p class="MsoNormal" align="center"><span style="font-family: 'Courier New';" lang="EN-US"><img alt="" src="/Develop/ArticleImages/24/24397/CSDN_Dev_Image_2004-2-16115392.gif" align="baseline" border="0" hspace="0" /></span></p>
<p class="MsoNormal">&nbsp;&nbsp;&nbsp; </p>
<div align="center">
<table class="MsoTableGrid" style="border: medium none ; background: #e6e6e6 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; margin-left: 23.4pt; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td style="padding: 0cm 5.4pt; width: 387pt;" valign="top" width="516">
            <p class="MsoNormal" style="text-align: left;" align="left"><strong></strong>&nbsp;</p>
            <p class="MsoNormal" style="text-align: left;" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New';" lang="EN-US">public</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">
            </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New';" lang="EN-US">class</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">
            Girl {&nbsp;&nbsp;<br />
            </span><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">&nbsp;&nbsp;&nbsp;
            </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New';" lang="EN-US">void</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">
            kiss(){<br />
            </span><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Boy boy
            = </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New';" lang="EN-US">new</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">
            Boy();<br />
            </span><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">&nbsp;&nbsp;&nbsp;
            }<br />
            </span><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">}</span></p>
            <p class="MsoNormal">&nbsp;</p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><span style="font-family: 'Courier New';" lang="EN-US">&nbsp;&nbsp;&nbsp;
</span><span style="font-family: 宋体;">然而从开始就创建的</span><span style="font-family: 'Courier New';" lang="EN-US">Boy</span><span style="font-family: 宋体;">缺点就是无法在更换。并且要负责</span><span style="font-family: 'Courier New';" lang="EN-US">Boy</span><span style="font-family: 宋体;">的整个生命周期。如果我们的</span><span style="font-family: 'Courier New';" lang="EN-US">Girl</span><span style="font-family: 宋体;">想要换一个怎么办？（笔者严重不支持</span><span style="font-family: 'Courier New';" lang="EN-US">Girl</span><span style="font-family: 宋体;">经常更换</span><span style="font-family: 'Courier New';" lang="EN-US">Boy</span><span style="font-family: 宋体;">）</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><span style="font-family: 'Courier New';" lang="EN-US">&nbsp;&nbsp;&nbsp;
</span><strong><span style="color: #333399; font-family: 宋体;">亲友介绍</span></strong><span style="font-family: 宋体;">：由中间人负责提供</span><span style="font-family: 'Courier New';" lang="EN-US">Boy</span><span style="font-family: 宋体;">来见面</span></p>
<p class="MsoNormal" style="text-align: center;" align="center"></p>
<p class="MsoNormal"><span style="font-family: 'Courier New';" lang="EN-US"><img alt="" src="/Develop/ArticleImages/24/24397/CSDN_Dev_Image_2004-2-16115394.gif" align="baseline" border="0" hspace="0" /></span></p>
<p class="MsoNormal"><span style="font-family: 'Courier New';" lang="EN-US">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
</span></p>
<div align="center">
<table class="MsoTableGrid" style="border: medium none ; background: #e6e6e6 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; margin-left: 23.4pt; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td style="padding: 0cm 5.4pt; width: 387pt;" valign="top" width="516">
            <p class="MsoNormal" style="text-align: left;" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New';" lang="EN-US"><br />
            public</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">
            </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New';" lang="EN-US">class</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">
            Girl {<br />
            </span><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">&nbsp;&nbsp;&nbsp;
            </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New';" lang="EN-US">void</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">
            kiss(){<br />
            </span><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Boy boy
            = BoyFactory.createBoy();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
            </span><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">&nbsp;&nbsp;&nbsp;
            }<br />
            </span><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">}<br />
            </span></p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><span style="font-family: 'Courier New';" lang="EN-US">&nbsp;&nbsp;&nbsp;
</span><span style="font-family: 宋体;">亲友介绍，固然是好。如果不满意，尽管另外换一个好了。但是，亲友</span><span style="font-family: 'Courier New';" lang="EN-US">BoyFactory</span><span style="font-family: 宋体;">经常是以</span><span style="font-family: 'Courier New';" lang="EN-US">Singleton</span><span style="font-family: 宋体;">的形式出现，不然就是，存在于</span><span style="font-family: 'Courier New';" lang="EN-US">Globals</span><span style="font-family: 宋体;">，无处不在，无处不能。实在是太繁琐了一点，不够灵活。我为什么一定要这个亲友掺和进来呢？为什么一定要付给她介绍费呢？万一最好的朋友爱上了我的男朋友呢？</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><span style="font-family: 'Courier New';" lang="EN-US">&nbsp;&nbsp;&nbsp;
</span><strong><span style="color: #333399; font-family: 宋体;">父母包办</span></strong><span style="font-family: 宋体;">：一切交给父母，自己不用费吹灰之力，只需要等着</span><span style="font-family: 'Courier New';" lang="EN-US">Kiss</span><span style="font-family: 宋体;">就好了。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal" style="text-align: center;" align="center"></p>
<p class="MsoNormal" align="center"><span style="font-family: 'Courier New';" lang="EN-US"><img alt="" src="/Develop/ArticleImages/24/24397/CSDN_Dev_Image_2004-2-16115396.gif" align="baseline" border="0" hspace="0" /></span></p>
<p class="MsoNormal"><span style="font-family: 'Courier New';" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span></p>
<div align="center">
<table class="MsoTableGrid" style="border: medium none ; background: #e6e6e6 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; margin-left: 23.4pt; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td style="padding: 0cm 5.4pt; width: 387pt;" valign="top" width="516"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New';" lang="EN-US">
            <p class="MsoNormal" style="text-align: left;" align="left"><br />
            public</p>
            </span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">
            </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New';" lang="EN-US">class</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">
            Girl {<br />
            </span><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">&nbsp;&nbsp;&nbsp;
            </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New';" lang="EN-US">void</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">
            kiss(Boy boy){<br />
            </span><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // kiss
            boy&nbsp;&nbsp;<br />
            </span><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            boy.kiss();<br />
            </span><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">&nbsp;&nbsp;&nbsp;
            }<br />
            </span><span style="font-size: 10pt; color: black; font-family: 'Courier New';" lang="EN-US">}<br />
            </span></td>
        </tr>
    </tbody>
</table>
</div>
<p class="MsoNormal"><span style="font-family: 'Courier New';" lang="EN-US">&nbsp;&nbsp;&nbsp;
Well</span><span style="font-family: 宋体;">，这是对</span><span style="font-family: 'Courier New';" lang="EN-US">Girl</span><span style="font-family: 宋体;">最好的方法，只要想办法贿赂了</span><span style="font-family: 'Courier New';" lang="EN-US">Girl</span><span style="font-family: 宋体;">的父母，并把</span><span style="font-family: 'Courier New';" lang="EN-US">Boy</span><span style="font-family: 宋体;">交给他。那么我们就可以轻松的和</span><span style="font-family: 'Courier New';" lang="EN-US">Girl</span><span style="font-family: 宋体;">来</span><span style="font-family: 'Courier New';" lang="EN-US">Kiss</span><span style="font-family: 宋体;">了。看来几千年传统的父母之命还真是有用哦。至少</span><span style="font-family: 'Courier New';" lang="EN-US">Boy</span><span style="font-family: 宋体;">和</span><span style="font-family: 'Courier New';" lang="EN-US">Girl</span><span style="font-family: 宋体;">不用自己瞎忙乎了。</span></p>
<p class="MsoNormal"><span style="font-family: 'Courier New';" lang="EN-US">&nbsp;&nbsp;&nbsp;
</span><span style="font-family: 宋体;">这就是</span><span style="font-family: 'Courier New';" lang="EN-US">IOC</span><span style="font-family: 宋体;">，将对象的创建和获取提取到外部。由外部容器提供需要的组件。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><span style="font-family: 'Courier New';" lang="EN-US">&nbsp;&nbsp;&nbsp;
</span><span style="font-family: 宋体;">我们知道<strong><span style="color: #993366;">好莱坞原则</span></strong>：</span><span style="font-family: 'Courier New';" lang="EN-US">&#8220;Do not call us, we will call you.&#8221;
</span><span style="font-family: 宋体;">意思就是，</span><span style="font-family: 'Courier New';" lang="EN-US">You, girlie, do not call the boy. We will
feed you a boy</span><span style="font-family: 宋体;">。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><span style="font-family: 'Courier New';" lang="EN-US">&nbsp;&nbsp;&nbsp;
</span><span style="font-family: 宋体;">我们还应该知道<strong><span style="color: #993366;">依赖倒转原则</span></strong>即</span><span style="font-family: 'Courier New';" lang="EN-US"> Dependence Inversion Princinple</span><span style="font-family: 宋体;">，</span><span style="font-family: 'Courier New';" lang="EN-US">DIP</span><span style="font-family: 宋体;">。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal" style="text-align: center;" align="center"></p>
<p class="MsoNormal" align="center"><span style="font-family: 'Courier New';" lang="EN-US"><img alt="" src="/Develop/ArticleImages/24/24397/CSDN_Dev_Image_2004-2-16115398.gif" align="baseline" border="0" hspace="0" /></span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span style="font-family: 'Courier New';" lang="EN-US">Eric Gamma</span><span style="font-family: 宋体;">说，要面向抽象编程。面向接口编程是面向对象的核心。</span></p>
<p class="MsoNormal" style="margin-left: 18pt;"><span style="font-family: 宋体;">组件应该分为两部分，即</span></p>
<p class="MsoNormal" style="margin-left: 39pt; text-indent: 3pt;"><strong><span style="color: #333399; font-family: 'Courier New';" lang="EN-US">Service</span></strong><span style="font-family: 'Courier New';" lang="EN-US">, </span><span style="font-family: 宋体;">所提供功能的声明</span></p>
<p class="MsoNormal" style="margin-left: 39pt; text-indent: 3pt;"><strong><span style="color: #333399; font-family: 'Courier New';" lang="EN-US">Implementation</span></strong><span style="font-family: 'Courier New';" lang="EN-US">, Service</span><span style="font-family: 宋体;">的实现</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">好处是：多实现可以任意切换，防止</span><span style="font-family: 'Courier New';"> </span><span style="font-family: 宋体;">&#8220;</span><span style="font-family: 'Courier New';" lang="EN-US">everything depends on everything</span><span style="font-family: 宋体;">&#8221;</span><span style="font-family: 'Courier New';">
</span><span style="font-family: 宋体;">问题．即具体依赖于具体。</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">所以，我们的</span><span style="font-family: 'Courier New';" lang="EN-US">Boy</span><span style="font-family: 宋体;">应该是实现</span><span style="font-family: 'Courier New';" lang="EN-US">Kissable</span><span style="font-family: 宋体;">接口。这样一旦</span><span style="font-family: 'Courier New';" lang="EN-US">Girl</span><span style="font-family: 宋体;">不想</span><span style="font-family: 'Courier New';" lang="EN-US">kiss</span><span style="font-family: 宋体;">可恶的</span><span style="font-family: 'Courier New';" lang="EN-US">Boy</span><span style="font-family: 宋体;">的话，还可以</span><span style="font-family: 'Courier New';" lang="EN-US">kiss</span><span style="font-family: 宋体;">可爱的</span><span style="font-family: 'Courier New';" lang="EN-US">kitten</span><span style="font-family: 宋体;">和慈祥的</span><span style="font-family: 'Courier New';" lang="EN-US">grandmother</span><span style="font-family: 宋体;">。</span></p>
<p class="MsoNormal" style="text-indent: 21pt;">&nbsp;</p>
<p class="MsoNormal" style="text-indent: 21pt;"></p>
<p class="MsoNormal"><span style="font-family: 'Courier New';" lang="EN-US"><img alt="" src="/Develop/ArticleImages/24/24397/CSDN_Dev_Image_2004-2-161153910.gif" align="baseline" border="0" hspace="0" /></span></p>
<p class="MsoNormal"><strong><span style="color: #333399; font-family: 宋体;">二、</span></strong><strong><span style="color: #333399; font-family: 'Courier New';" lang="EN-US">IOC</span></strong><strong><span style="color: #333399; font-family: 宋体;">的</span></strong><strong><span style="color: #333399; font-family: 'Courier New';" lang="EN-US">type</span></strong></p>
<p class="MsoNormal"><span style="font-family: 'Courier New';" lang="EN-US">&nbsp;&nbsp;&nbsp;
IoC</span><span style="font-family: 宋体;">的</span><span style="font-family: 'Courier New';" lang="EN-US">Type</span><span style="font-family: 宋体;">指的是</span><span style="font-family: 'Courier New';" lang="EN-US">Girl</span><span style="font-family: 宋体;">得到</span><span style="font-family: 'Courier New';" lang="EN-US">Boy</span><span style="font-family: 宋体;">的几种不同方式。我们逐一来说明。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><span style="font-family: 'Courier New';" lang="EN-US">&nbsp;&nbsp;&nbsp;
<strong><span style="color: #333399;">IOC type 0</span></strong></span><strong><span style="color: #333399; font-family: 宋体;">：</span></strong><span style="font-family: 宋体;">不用</span><span style="font-family: 'Courier New';" lang="EN-US">IOC</span></p>
<p class="MsoNormal">&nbsp;</p>
<div align="center">
<table class="MsoTableGrid" style="border: medium none ; background: #e6e6e6 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; margin-left: 23.4pt; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td style="padding: 0cm 5.4pt; width: 387pt;" valign="top" width="516">
            <p class="MsoNormal" style="text-align: left;" align="left"><strong></strong>&nbsp;</p>
            <p class="MsoNormal" style="text-align: left;" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体;" lang="EN-US">public</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">
            </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体;" lang="EN-US">class</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US"> Girl
            </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体;" lang="EN-US">implements</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US"> Servicable
            {</span></p>
            <p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体;" lang="EN-US">private</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US"> Kissable
            kissable;</span></p>
            <p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体;" lang="EN-US">public</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US"> Girl()
            {<br />
            </span><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; kissable =
            </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体;" lang="EN-US">new</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">
            Boy();<br />
            </span><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp; }</span></p>
            <p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体;" lang="EN-US">public</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">
            </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体;" lang="EN-US">void</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">
            kissYourKissable() {<br />
            </span><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            kissable.kiss();<br />
            </span><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp; }</span></p>
            <p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">}</span></p>
            <p class="MsoNormal">&nbsp;</p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><span style="font-family: 'Courier New';" lang="EN-US">&nbsp;&nbsp;&nbsp;
Girl</span><span style="font-family: 宋体;">自己建立自己的</span><span style="font-family: 'Courier New';" lang="EN-US">Boy</span><span style="font-family: 宋体;">，很难更换，很难共享给别人，只能单独使用，并负责完全的生命周期。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="color: #333399; font-family: 'Courier New';" lang="EN-US">&nbsp;&nbsp;&nbsp; IOC type
1</span></strong><strong><span style="color: #333399; font-family: 宋体;">，</span></strong><span style="font-family: 宋体;">先看代码：</span></p>
<p class="MsoNormal">&nbsp;</p>
<div align="center">
<table class="MsoTableGrid" style="border: medium none ; background: #e6e6e6 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; margin-left: 23.4pt; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td style="padding: 0cm 5.4pt; width: 387pt;" valign="top" width="516">
            <p class="MsoNormal" style="text-align: left;" align="left"><strong></strong>&nbsp;</p>
            <p class="MsoNormal" style="text-align: left;" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体;" lang="EN-US">public</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">
            </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体;" lang="EN-US">class</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US"> Girl
            </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体;" lang="EN-US">implements</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US"> Servicable
            {</span></p>
            <p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp; Kissable
            kissable;</span></p>
            <p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体;" lang="EN-US">public</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">
            </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体;" lang="EN-US">void</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">
            service(ServiceManager mgr) {<br />
            </span><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; kissable =
            (Kissable) mgr.lookup(</span><span style="font-size: 10pt; color: black; font-family: 宋体;">&#8220;<span lang="EN-US">kissable</span>&#8221;<span lang="EN-US">);<br />
            </span></span><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp; }</span></p>
            <p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体;" lang="EN-US">public</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">
            </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体;" lang="EN-US">void</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">
            kissYourKissable() {<br />
            </span><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            kissable.kiss();<br />
            </span><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp; }</span></p>
            <p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">}</span></p>
            <p class="MsoNormal">&nbsp;</p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><span style="font-family: 'Courier New';" lang="EN-US">&nbsp;&nbsp;&nbsp;
</span><span style="font-family: 宋体;">这种情况出现于</span><span style="font-family: 'Courier New';" lang="EN-US">Avalon Framework</span><span style="font-family: 宋体;">。一个组件实现了</span><span style="font-family: 'Courier New';" lang="EN-US">Servicable</span><span style="font-family: 宋体;">接口，就必须实现</span><span style="font-family: 'Courier New';" lang="EN-US">service</span><span style="font-family: 宋体;">方法，并传入一个</span><span style="font-family: 'Courier New';" lang="EN-US">ServiceManager</span><span style="font-family: 宋体;">。其中会含有需要的其它组件。只需要在</span><span style="font-family: 'Courier New';" lang="EN-US">service</span><span style="font-family: 宋体;">方法中初始化需要的</span><span style="font-family: 'Courier New';" lang="EN-US">Boy</span><span style="font-family: 宋体;">。</span></p>
<p class="MsoNormal"><span style="font-family: 'Courier New';" lang="EN-US">&nbsp;&nbsp;&nbsp;
</span><span style="font-family: 宋体;">另外，</span><span style="font-family: 'Courier New';" lang="EN-US">J2EE</span><span style="font-family: 宋体;">中从</span><span style="font-family: 'Courier New';" lang="EN-US">Context</span><span style="font-family: 宋体;">取得对象也属于</span><span style="font-family: 'Courier New';" lang="EN-US">type 1</span><span style="font-family: 宋体;">。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><span style="font-family: 'Courier New';" lang="EN-US">&nbsp;&nbsp;&nbsp;
</span><span style="font-family: 宋体;">它依赖于配置文件</span></p>
<div align="center">
<table class="MsoTableGrid" style="border: medium none ; background: #e6e6e6 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; margin-left: 23.4pt; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td style="padding: 0cm 5.4pt; width: 387pt;" valign="top" width="516">
            <p class="MsoNormal" style="text-align: left;" align="left"><strong></strong>&nbsp;</p>
            <p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: #333399; font-family: 宋体;" lang="EN-US">&lt;container&gt;<br />
            </span><span style="font-size: 10pt; color: #333399; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp;
            &lt;component name=</span><span style="font-size: 10pt; color: #333399;" lang="EN-US">&#8220;</span><span style="font-size: 10pt; color: #333399; font-family: 宋体;" lang="EN-US">kissable</span><span style="font-size: 10pt; color: #333399;" lang="EN-US">&#8220;</span><span style="font-size: 10pt; color: #333399; font-family: 宋体;" lang="EN-US"> class=</span><span style="font-size: 10pt; color: #333399;" lang="EN-US">&#8220;</span><span style="font-size: 10pt; color: #333399; font-family: 宋体;" lang="EN-US">Boy"&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            &lt;configuration&gt; </span><span style="font-size: 10pt; color: #333399;" lang="EN-US">&#8230;</span><span style="font-size: 10pt; color: #333399; font-family: 宋体;" lang="EN-US">
            &lt;/configuration&gt;<br />
            </span><span style="font-size: 10pt; color: #333399; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp;
            &lt;/component&gt;</span></p>
            <p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: #333399; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #993366; font-family: 宋体;" lang="EN-US">&lt;component
            name=</span></strong><strong><span style="font-size: 10pt; color: #993366;" lang="EN-US">&#8220;</span></strong><strong><span style="font-size: 10pt; color: #993366; font-family: 宋体;" lang="EN-US">girl"
            class=</span></strong><strong><span style="font-size: 10pt; color: #993366;" lang="EN-US">&#8220;</span></strong><strong><span style="font-size: 10pt; color: #993366; font-family: 宋体;" lang="EN-US">Girl"
            /&gt;<br />
            </span></strong><span style="font-size: 10pt; color: #333399; font-family: 宋体;" lang="EN-US">&lt;/container&gt;
            </span></p>
            <p class="MsoNormal">&nbsp;</p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><span style="font-family: 'Courier New';" lang="EN-US">&nbsp;&nbsp;&nbsp;
<strong><span style="color: #333399;">IOC type 2</span></strong></span><strong><span style="color: #333399; font-family: 宋体;">：</span></strong></p>
<p class="MsoNormal"><span style="font-family: 'Courier New';" lang="EN-US">&nbsp;&nbsp;&nbsp;
</span></p>
<div align="center">
<table class="MsoTableGrid" style="border: medium none ; background: #e6e6e6 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; margin-left: 23.4pt; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td style="padding: 0cm 5.4pt; width: 387pt;" valign="top" width="516">
            <p class="MsoNormal" style="text-align: left;" align="left"><strong></strong>&nbsp;</p>
            <p class="MsoNormal" style="text-align: left;" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体;" lang="EN-US">public</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">
            </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体;" lang="EN-US">class</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US"> Girl
            {</span></p>
            <p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体;" lang="EN-US">private</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US"> Kissable
            kissable;</span></p>
            <p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体;" lang="EN-US">public</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">
            </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体;" lang="EN-US">void</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">
            setKissable(Kissable kissable) {<br />
            </span><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体;" lang="EN-US">this</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">.kissable =
            kissable;<br />
            </span><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp; }</span></p>
            <p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体;" lang="EN-US">public</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">
            </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体;" lang="EN-US">void</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">
            kissYourKissable() {<br />
            </span><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            kissable.kiss();<br />
            </span><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp; }</span></p>
            <p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">}</span></p>
            <p class="MsoNormal">&nbsp;</p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><span style="font-family: 'Courier New';" lang="EN-US">&nbsp;&nbsp;&nbsp; Type
2</span><span style="font-family: 宋体;">出现于</span><span style="font-family: 'Courier New';" lang="EN-US">Spring Framework</span><span style="font-family: 宋体;">，是通过</span><span style="font-family: 'Courier New';" lang="EN-US">JavaBean</span><span style="font-family: 宋体;">的</span><span style="font-family: 'Courier New';" lang="EN-US">set</span><span style="font-family: 宋体;">方法来将需要的</span><span style="font-family: 'Courier New';" lang="EN-US">Boy</span><span style="font-family: 宋体;">传递给</span><span style="font-family: 'Courier New';" lang="EN-US">Girl</span><span style="font-family: 宋体;">。它必须依赖于配置文件。</span></p>
<p class="MsoNormal"><span style="font-family: 'Courier New';" lang="EN-US">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
</span></p>
<div align="center">
<table class="MsoTableGrid" style="border: medium none ; background: #e6e6e6 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; margin-left: 23.4pt; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td style="padding: 0cm 5.4pt; width: 387pt;" valign="top" width="516">
            <p class="MsoNormal" style="text-align: left;" align="left">&nbsp;</p>
            <p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: #333399; font-family: 宋体;" lang="EN-US">&lt;beans&gt;<br />
            </span><span style="font-size: 10pt; color: #333399; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp; &lt;bean
            id=</span><span style="font-size: 10pt; color: #333399;" lang="EN-US">&#8220;</span><span style="font-size: 10pt; color: #333399; font-family: 宋体;" lang="EN-US">boy"
            class=</span><span style="font-size: 10pt; color: #333399;" lang="EN-US">&#8220;</span><span style="font-size: 10pt; color: #333399; font-family: 宋体;" lang="EN-US">Boy"/&gt;<br />
            </span><span style="font-size: 10pt; color: #333399; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp; &lt;bean
            id=</span><span style="font-size: 10pt; color: #333399;" lang="EN-US">&#8220;</span><span style="font-size: 10pt; color: #333399; font-family: 宋体;" lang="EN-US">girl</span><span style="font-size: 10pt; color: #333399;" lang="EN-US">&#8220;</span><span style="font-size: 10pt; color: #333399; font-family: 宋体;" lang="EN-US"> class=</span><span style="font-size: 10pt; color: #333399;" lang="EN-US">&#8220;</span><span style="font-size: 10pt; color: #333399; font-family: 宋体;" lang="EN-US">Girl"&gt;<br />
            </span><span style="font-size: 10pt; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong><span style="color: #993366;">&lt;property name=</span></strong></span><strong><span style="font-size: 10pt; color: #993366;" lang="EN-US">&#8220;</span></strong><strong><span style="font-size: 10pt; color: #993366; font-family: 宋体;" lang="EN-US">kissable"&gt;<br />
            </span></strong><strong><span style="font-size: 10pt; color: #993366; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            &lt;ref bean=</span></strong><strong><span style="font-size: 10pt; color: #993366;" lang="EN-US">&#8220;</span></strong><strong><span style="font-size: 10pt; color: #993366; font-family: 宋体;" lang="EN-US">boy"/&gt;<br />
            </span></strong><span style="font-size: 10pt; color: #333399; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            &lt;/property&gt;<br />
            </span><span style="font-size: 10pt; color: #333399; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp;
            &lt;/bean&gt;<br />
            </span><span style="font-size: 10pt; color: #333399; font-family: 宋体;" lang="EN-US">&lt;/beans&gt;
            </span></p>
            <p class="MsoNormal">&nbsp;</p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="color: #333399; font-family: 'Courier New';" lang="EN-US">IOC type 3</span></strong></p>
<p class="MsoNormal">&nbsp;</p>
<div align="center">
<table class="MsoTableGrid" style="border: medium none ; background: #e6e6e6 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; margin-left: 23.4pt; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td style="padding: 0cm 5.4pt; width: 387pt;" valign="top" width="516">
            <p class="MsoNormal" style="text-align: left;" align="left"><strong></strong>&nbsp;</p>
            <p class="MsoNormal" style="text-align: left;" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体;" lang="EN-US">public</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">
            </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体;" lang="EN-US">class</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US"> Girl
            {</span></p>
            <p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体;" lang="EN-US">private</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US"> Kissable
            kissable;</span></p>
            <p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体;" lang="EN-US">public</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US"> Girl(Kissable
            kissable) {<br />
            </span><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体;" lang="EN-US">this</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">.kissable =
            kissable;<br />
            </span><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp; }</span></p>
            <p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体;" lang="EN-US">public</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">
            </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体;" lang="EN-US">void</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">
            kissYourKissable() {<br />
            </span><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
            kissable.kiss();<br />
            </span><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">&nbsp;&nbsp;&nbsp; }</span></p>
            <p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">}</span></p>
            <p class="MsoNormal">&nbsp;</p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><span style="font-family: 'Courier New';" lang="EN-US">&nbsp;&nbsp;&nbsp;
</span><span style="font-family: 宋体;">这就是</span><span style="font-family: 'Courier New';" lang="EN-US">PicoContainer</span><span style="font-family: 宋体;">的组件</span><span style="font-family: 'Courier New';">
</span><span style="font-family: 宋体;">。通过构造函数传递</span><span style="font-family: 'Courier New';" lang="EN-US">Boy</span><span style="font-family: 宋体;">给</span><span style="font-family: 'Courier New';" lang="EN-US">Girl</span><span style="font-family: 宋体;">。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal">&nbsp;</p>
<div align="center">
<table class="MsoTableGrid" style="border: medium none ; background: #e6e6e6 none repeat scroll 0% 0%; -moz-background-clip: border; -moz-background-origin: padding; -moz-background-inline-policy: continuous; margin-left: 23.4pt; border-collapse: collapse;" border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td style="padding: 0cm 5.4pt; width: 387pt;" valign="top" width="516">
            <p class="MsoNormal" style="text-align: left;" align="left">&nbsp;</p>
            <p class="MsoNormal" style="text-align: left;" align="left"><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">PicoContainer container =
            </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体;" lang="EN-US">new</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">
            DefaultPicoContainer();<br />
            </span><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">container.registerComponentImplementation(Boy.</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体;" lang="EN-US">class</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">);<br />
            </span><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">container.registerComponentImplementation(Girl.</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体;" lang="EN-US">class</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">);<br />
            </span><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">Girl girl =
            (Girl) container.getComponentInstance(Girl.</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 宋体;" lang="EN-US">class</span></strong><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">);<br />
            </span><span style="font-size: 10pt; color: black; font-family: 宋体;" lang="EN-US">girl.kissYourKissable();</span></p>
            <p class="MsoNormal">&nbsp;</p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><span style="font-family: 'Courier New';" lang="EN-US">&nbsp;&nbsp;&nbsp;
</span><span style="font-family: 宋体;">关于</span><span style="font-family: 'Courier New';" lang="EN-US">PicoContainer</span><span style="font-family: 宋体;">，作者后续文章会详细介绍。</span></p>
<p class="MsoNormal">&nbsp;</p>
<p class="MsoNormal"><strong><span style="color: #333399; font-family: 宋体;">作者语：</span></strong><span style="font-family: 'Courier New';" lang="EN-US">&nbsp;&nbsp; </span></p>
<p class="MsoNormal"><span style="font-family: 'Courier New';" lang="EN-US">&nbsp;&nbsp;&nbsp;
Well</span><span style="font-family: 宋体;">，以上的这些理论部分有些已经有了新的定义了。过些天我会再写一些文章具体说明。比如，原来的三种</span><span style="font-family: 'Courier New';" lang="EN-US">type</span><span style="font-family: 宋体;">结构现在已经重新定义为依赖注射的许多层次。</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 'Courier New';" lang="EN-US">IoC</span><span style="font-family: 宋体;">很年轻，还在发展。伴随着</span><span style="font-family: 'Courier New';" lang="EN-US">IOC</span><span style="font-family: 宋体;">的发展，</span><span style="font-family: 'Courier New';" lang="EN-US">AOP</span><span style="font-family: 宋体;">，</span><span style="font-family: 'Courier New';" lang="EN-US">COP</span><span style="font-family: 宋体;">，</span><span style="font-family: 'Courier New';" lang="EN-US">SOP</span><span style="font-family: 宋体;">等等都在不断的发展。作为程序员，随时关注着新的思想的发展是一件很轻松愉快的事情。有没有人愿意和我一起探讨学习共同进步呀！</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">摘自：http://dev.csdn.net/develop/article/24/24397.shtm<br />
</span></p>
<img src ="http://www.blogjava.net/zhanglongsr/aggbug/348680.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglongsr/" target="_blank">zhangxl</a> 2011-04-21 10:13 <a href="http://www.blogjava.net/zhanglongsr/articles/348680.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Java动态代理实现AOP </title><link>http://www.blogjava.net/zhanglongsr/articles/348676.html</link><dc:creator>zhangxl</dc:creator><author>zhangxl</author><pubDate>Thu, 21 Apr 2011 01:45:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglongsr/articles/348676.html</guid><wfw:comment>http://www.blogjava.net/zhanglongsr/comments/348676.html</wfw:comment><comments>http://www.blogjava.net/zhanglongsr/articles/348676.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglongsr/comments/commentRss/348676.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglongsr/services/trackbacks/348676.html</trackback:ping><description><![CDATA[导读： <br />
目前整个开发社区对AOP(Aspect Oriented Programing)推崇备至，也涌现出大量支持AOP的优秀Framework，--Spring， JAC， Jboss AOP 等等。AOP似乎一时之间成了潮流。Java初学者不禁要发出感慨，OOP还没有学通呢，又来AOP。本系列文章便是为您做出这方面的补救，只是通过一个简单的例子便可以向初学者展示一下如何来进行AOP。 <br />
<br />
为了简单起见，例子没有没有使用任何第三方的AOP Framework， 而是利用Java语言本身自带的动态代理功能来实现AOP。 <br />
<br />
让我们先回到AOP本身，AOP主要应用于日志记录，性能统计，安全控制，事务处理等方面。它的主要意图就要将日志记录，性能统计，安全控制等等代码从商业逻辑代码中清楚的划分出来，我们可以把这些行为一个一个单独看作系统所要解决的问题，就是所谓的面向问题的编程(不知将AOP译作面向问题的编程是否欠妥)。通过对这些行为的分离，我们希望可以将它们独立地配置到商业方法中，而要改变这些行为也不需要影响到商业方法代码。 <br />
<br />
假设系统由一系列的BusinessObject所完成业务逻辑功能，系统要求在每一次业务逻辑处理时要做日志记录。这里我们略去具体的业务逻辑代码。 <br />
<br />
public interface BusinessInterface { <br />
public void processBusiness(); <br />
} <br />
<br />
public class BusinessObject implements BusinessInterface { <br />
private Logger logger = Logger.getLogger(this.getClass().getName()); <br />
public void processBusiness(){ <br />
try { <br />
logger.info("start to processing..."); <br />
//business logic here。 <br />
System.out.println(&#8220;here is business logic&#8221;); <br />
logger.info("end processing..."); <br />
} catch (Exception e){ <br />
logger.info("exception happends..."); <br />
//exception handling <br />
} <br />
} <br />
} <br />
<br />
这里处理商业逻辑的代码和日志记录代码混合在一起，这给日后的维护带来一定的困难，并且也会造成大量的代码重复。完全相同的log代码将出现在系统的每一个BusinessObject中。 <br />
<br />
按照AOP的思想，我们应该把日志记录代码分离出来。要将这些代码分离就涉及到一个问题，我们必须知道商业逻辑代码何时被调用，这样我们好插入日志记录代码。一般来说要截获一个方法，我们可以采用回调方法或者动态代理。动态代理一般要更加灵活一些，目前多数的AOP Framework也大都采用了动态代理来实现。这里我们也采用动态代理作为例子。 <br />
<br />
JDK1.2以后提供了动态代理的支持，程序员通过实现java.lang.reflect.InvocationHandler接口提供一个执行处理器，然后通过 java.lang.reflect.Proxy得到一个代理对象，通过这个代理对象来执行商业方法，在商业方法被调用的同时，执行处理器会被自动调用。 <br />
<br />
有了JDK的这种支持，我们所要做的仅仅是提供一个日志处理器。 <br />
<br />
public class LogHandler implements InvocationHandler { <br />
<br />
private Logger logger ＝ Logger.getLogger( <br />
this.getClass().getName()); <br />
private Object delegate; <br />
public LogHandler(Object delegate){ <br />
this.delegate = delegate; <br />
} <br />
<br />
public Object invoke(Object proxy， <br />
Method method， Object[] args) <br />
throws Throwable { <br />
Object o = null; <br />
try { <br />
logger.info("method stats..." ＋ method); <br />
o = method.invoke(delegate，args); <br />
logger.info("method ends..." + method); <br />
} catch (Exception e){ <br />
logger.info("Exception happends..."); <br />
//excetpion handling。 <br />
} <br />
return o; <br />
} <br />
} <br />
<br />
现在我们可以把BusinessObject里面的所有日志处理代码全部去掉了。 <br />
<br />
public class BusinessObject implements BusinessInterface { <br />
<br />
private Logger logger = Logger.getLogger( <br />
this.getClass().getName()); <br />
public void processBusiness(){ <br />
//business processing <br />
System.out.println(&#8220;here is business logic&#8221;); <br />
} <br />
} <br />
<br />
客户端调用商业方法的代码如下： <br />
<br />
BusinessInterface businessImp = new BusinessObject(); <br />
<br />
InvocationHandler handler = <br />
new LogHandler(businessImp); <br />
<br />
BusinessInterface proxy = ( <br />
BusinessInterface) Proxy.newProxyInstance( <br />
businessImp.getClass().getClassLoader()， <br />
businessImp.getClass().getInterfaces()， <br />
handler); <br />
<br />
proxy.processBusiness(); <br />
<br />
程序输出如下： <br />
<br />
INFO: method stats..。 <br />
here is business logic <br />
INFO: method ends..。 <br />
<br />
至此我们的第一次小尝试算是完成了。可以看到，采用AOP之后，日志记录和业务逻辑代码完全分开了，以后要改变日志记录的话只需要修改日志记录处理器就行了，而业务对象本身（BusinessObject）无需做任何修改。并且这个日志记录不会造成重复代码了，所有的商业处理对象都可以重用这个日志处理器。 <br />
<br />
当然在实际应用中，这个例子就显得太粗糙了。由于JDK的动态代理并没有直接支持一次注册多个 InvocationHandler，那么我们对业务处理方法既要日志记录又要性能统计时，就需要自己做一些变通了。一般我们可以自己定义一个 Handler接口，然后维护一个队列存放所有Handler，当InvocationHandler被触发的时候我们依次调用自己的Handler。所幸的是目前几乎所有的AOP Framework都对这方面提供了很好的支持.这里推荐大家使用Spring。 <br />
<br />
本文转自 ：http://blog.csdn.net/turkeyzhou/archive/2008/03/01/2137358.aspx<br />
<img src ="http://www.blogjava.net/zhanglongsr/aggbug/348676.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglongsr/" target="_blank">zhangxl</a> 2011-04-21 09:45 <a href="http://www.blogjava.net/zhanglongsr/articles/348676.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring下开发带有图片的html邮件</title><link>http://www.blogjava.net/zhanglongsr/articles/51461.html</link><dc:creator>zhangxl</dc:creator><author>zhangxl</author><pubDate>Thu, 08 Jun 2006 11:05:00 GMT</pubDate><guid>http://www.blogjava.net/zhanglongsr/articles/51461.html</guid><wfw:comment>http://www.blogjava.net/zhanglongsr/comments/51461.html</wfw:comment><comments>http://www.blogjava.net/zhanglongsr/articles/51461.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhanglongsr/comments/commentRss/51461.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhanglongsr/services/trackbacks/51461.html</trackback:ping><description><![CDATA[
		<p>   <font size="2">发送邮件需要通过验证,我们需要建立一个带有实现了Authenticator的Session.我们应该了解,在用Java编写JavaMail时是需要使用的验证的,但是,在Spring中没有提供注入验证实现的功能(即注入Authenticator的实现).但是我们可以用以下方式加以实现,下面就以gmail邮件为例说明:<br />   在Spring中的配置信息如下:</font></p>
		<div style="MARGIN: 5px 20px 20px">
				<pre class="alt2" dir="ltr" style="BORDER-RIGHT: 1px inset; PADDING-RIGHT: 6px; BORDER-TOP: 1px inset; PADDING-LEFT: 6px; PADDING-BOTTOM: 6px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: 1px inset; WIDTH: 700px; PADDING-TOP: 6px; BORDER-BOTTOM: 1px inset; HEIGHT: 498px; TEXT-ALIGN: left">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
							http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"&gt;

        &lt;!-- our Authenticator implementation --&gt;
	&lt;bean id="smtpAuthenticator"
		class="forums.mailtest.SmtpAuthenticator"&gt;
		&lt;constructor-arg value="yourname@gmail.com" /&gt;
		&lt;constructor-arg value="password" /&gt;
	&lt;/bean&gt;

        &lt;!-- now setup an authenticated session --&gt;
	&lt;bean id="mailSession" class="javax.mail.Session"
		factory-method="getInstance"&gt;
		&lt;constructor-arg&gt;
			&lt;props&gt;
				&lt;prop key="mail.smtp.auth"&gt;true&lt;/prop&gt;
				&lt;prop key="mail.smtp.socketFactory.port"&gt;465&lt;/prop&gt;
				&lt;prop key="mail.smtp.socketFactory.class"&gt;
					javax.net.ssl.SSLSocketFactory
				&lt;/prop&gt;
				&lt;prop key="mail.smtp.socketFactory.fallback"&gt;
					false
				&lt;/prop&gt;
			&lt;/props&gt;
		&lt;/constructor-arg&gt;
		&lt;constructor-arg ref="smtpAuthenticator" /&gt;
	&lt;/bean&gt;

        &lt;!-- and configure the MailSender with the authenticated session --&gt;
	&lt;bean id="mailSender"
		class="org.springframework.mail.javamail.JavaMailSenderImpl"&gt;
		&lt;property name="host" value="smtp.gmail.com" /&gt;
		&lt;property name="session" ref="mailSession" /&gt;
	&lt;/bean&gt;

	&lt;!-- this is a template message that we can pre-load with default state --&gt;
	&lt;bean id="templateMessage"
		class="org.springframework.mail.SimpleMailMessage"&gt;
		&lt;property name="from" value="yourname@gmail.com" /&gt;
		&lt;property name="subject" value="Testing" /&gt;
	&lt;/bean&gt;

	&lt;bean id="mailTest" class="forums.mailtest.MailTest"&gt;
		&lt;constructor-arg ref="mailSender" /&gt;
		&lt;constructor-arg ref="templateMessage" /&gt;
	&lt;/bean&gt;
&lt;/beans&gt;</pre>
				<br />
				<font color="#000000">
				</font>
				<font face="Arial" size="2">实现我们自己的验证实现</font>
		</div>
		<div style="MARGIN: 5px 20px 20px">
				<pre class="alt2" dir="ltr" style="BORDER-RIGHT: 1px inset; PADDING-RIGHT: 6px; BORDER-TOP: 1px inset; PADDING-LEFT: 6px; PADDING-BOTTOM: 6px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: 1px inset; WIDTH: 696px; PADDING-TOP: 6px; BORDER-BOTTOM: 1px inset; HEIGHT: 322px; TEXT-ALIGN: left">package forums.mailtest;

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;

public class SmtpAuthenticator extends Authenticator {
	private String username;
	private String password;
	
	public SmtpAuthenticator(String username, String password) {
		super();
		this.username = username;
		this.password = password;
	}

	public PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(username, password);
	}
}</pre>
		</div>   <font size="2">编写测试类发送邮件:</font><div style="MARGIN: 5px 20px 20px"><pre class="alt2" dir="ltr" style="BORDER-RIGHT: 1px inset; PADDING-RIGHT: 6px; BORDER-TOP: 1px inset; PADDING-LEFT: 6px; PADDING-BOTTOM: 6px; MARGIN: 0px; OVERFLOW: auto; BORDER-LEFT: 1px inset; WIDTH: 640px; PADDING-TOP: 6px; BORDER-BOTTOM: 1px inset; HEIGHT: 498px; TEXT-ALIGN: left">package forums.mailtest;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.mail.MailException;
import org.springframework.mail.MailSender;
import org.springframework.mail.SimpleMailMessage;

public class MailTest {
	private MailSender mailSender;
	private SimpleMailMessage templateMessage;
	public MailTest(MailSender mailSender, SimpleMailMessage templateMessage) {
		super();
		this.mailSender = mailSender;
		this.templateMessage = templateMessage;
	}
	
	public void sendMeMail() {
		SimpleMailMessage msg = new SimpleMailMessage(templateMessage);
		msg.setTo("test@example.com");
		msg.setText("This is a test.\nGo Spring!\n");
		try {
			this.mailSender.send(msg);
		} catch (MailException e) {
			System.err.println("Didn't work.");
			e.printStackTrace();
		}
	}
	
	public static final void main(String[] args) {
		ApplicationContext appCtx = new ClassPathXmlApplicationContext(new String[] {
				"forums/mailtest/application-config.xml"
		});
		
		MailTest tester = (MailTest) appCtx.getBean("mailTest");
		tester.sendMeMail();
	}
}</pre><br /><font size="2">   对于gmail端口的设置可以参考:</font><a href="http://mail.google.com/support/bin/answer.py?answer=13287" target="_blank"><font color="#22229c" size="2">http://mail.google.com/support/bin/a...y?answer=13287</font></a><font size="2">,个人认为yahoo和 gmail 都希望我们使用验证,并且我们可以为每个邮件服务器设置不同的端口.如果没有采用验证,与gmail的连接将会抛出一个没有验证信息的异常!</font></div><img src ="http://www.blogjava.net/zhanglongsr/aggbug/51461.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhanglongsr/" target="_blank">zhangxl</a> 2006-06-08 19:05 <a href="http://www.blogjava.net/zhanglongsr/articles/51461.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>