﻿<?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/tianya0801/category/29660.html</link><description>简，是一种境界.</description><language>zh-cn</language><lastBuildDate>Wed, 16 Apr 2008 15:13:37 GMT</lastBuildDate><pubDate>Wed, 16 Apr 2008 15:13:37 GMT</pubDate><ttl>60</ttl><item><title>JSON入门</title><link>http://www.blogjava.net/tianya0801/archive/2008/04/15/193161.html</link><dc:creator>未知数据</dc:creator><author>未知数据</author><pubDate>Tue, 15 Apr 2008 09:23:00 GMT</pubDate><guid>http://www.blogjava.net/tianya0801/archive/2008/04/15/193161.html</guid><wfw:comment>http://www.blogjava.net/tianya0801/comments/193161.html</wfw:comment><comments>http://www.blogjava.net/tianya0801/archive/2008/04/15/193161.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tianya0801/comments/commentRss/193161.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tianya0801/services/trackbacks/193161.html</trackback:ping><description><![CDATA[<font face="宋体" size="2">&nbsp;
<p align="left">1.json简介<br />
json(JavaScript Object Notation)是一种轻量级的数据交换格式,采用与<font color="#ff0000">编程语言无关的文本格式</font>,可替换XML成为AJAX程序中的数据交换格式.<br />
ob是一个字符串,如果把这个字符串赋值给一个javascript的变量,那么该变量就成为一个对象的引用,而这个对象就是用这个字符串所构建出来的</p>
<p align="left">2.json对象</p>
<div align="left">
<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="color: #000000">&lt;script type="text/javascript"&gt;<br />
var ob = {"name":"wang","age":25,"email":"<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#116;&#101;&#115;&#116;&#64;&#116;&#101;&#115;&#116;&#46;&#99;&#111;&#109;&#46;&#99;&#110;">test@test.com.cn</a>"};<br />
alert(ob.name);<br />
&lt;/script&gt;<br />
<img alt="" src="file:///D:/Program%20Files/鱼鱼多媒体日记本/temp/{70890743-D5DC-48C7-83B7-1C957AC31722}_None[1].gif" align="top" /></span></div>
</div>
</div>
<li>对象是属性、值对的集合。一个对象的开始于&#8220;{&#8221;，结束于&#8220;}&#8221;。每一个属性名和值间用&#8220;:&#8221;提示，属性间用&#8220;,&#8221;分隔。 </li>
<p>&nbsp;&nbsp;&nbsp; {"name":"wang","age":25,"email":"<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#116;&#101;&#115;&#116;&#64;&#116;&#101;&#115;&#116;&#46;&#99;&#111;&#109;&#46;&#99;&#110;">test@test.com.cn</a>"};<br />
&nbsp;&nbsp;&nbsp;&nbsp;{"name":{"firstName":"wang","lastName":"ning"},"age":25,"email":"<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#116;&#101;&#115;&#116;&#64;&#116;&#101;&#115;&#116;&#46;&#99;&#111;&#109;&#46;&#99;&#110;">test@test.com.cn</a>"};</p>
<li>数组是有顺序的值的集合。一个数组开始于"["，结束于"]"，值之间用","分隔。 </li>
<p>&nbsp;&nbsp;&nbsp; [{"name":"wang","age":25},{"name":"zhang","age":27}]</p>
<li>值可以是引号里的字符串、数字、true、false、null，也可以是对象或数组。这些结构都能<strong>嵌套</strong>。
<li>字符串和数字的定义和C或Java基本一致。</li>
<div align="left">&nbsp;</div>
<div align="left">3.xml与json的转换</div>
<div align="left">
<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="color: #000000">&lt;contact&gt;</span></div>
<div><span style="color: #000000">　&lt;friend&gt;<br />
　　&lt;name&gt;Michael&lt;/name&gt;<br />
　　&lt;email&gt;17bity@gmail.com&lt;/email&gt;<br />
　　&lt;homepage&gt;http://www.jialing.net&lt;/homepage&gt;<br />
　&lt;/friend&gt;</span></div>
<div><span style="color: #000000">　&lt;friend&gt;<br />
　　&lt;name&gt;John&lt;/name&gt;<br />
　　&lt;email&gt;john@gmail.com&lt;/email&gt;<br />
　　&lt;homepage&gt;http://www.john.com&lt;/homepage&gt;<br />
　&lt;/friend&gt;</span></div>
<div><span style="color: #000000">　 &lt;friend&gt;<br />
　　&lt;name&gt;Peggy&lt;/name&gt;<br />
　　&lt;email&gt;peggy@gmail.com&lt;/email&gt;<br />
　　&lt;homepage&gt;http://www.peggy.com&lt;/homepage&gt;<br />
　&lt;/friend&gt;</span></div>
<div><span style="color: #000000">&lt;/contact&gt;</span></div>
<span style="color: #000000">
<div><img alt="" src="file:///D:/Program%20Files/鱼鱼多媒体日记本/temp/{188178D7-5409-497E-92A9-1D989C1780C7}_None[1].gif" align="top" /></div>
</span></div>
</div>
<div align="left">&nbsp;</div>
<div align="left">
<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="color: #000000">JSON:
<div>[<br />
{<br />
　name:"Michael",<br />
　email:"<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#49;&#55;&#98;&#105;&#116;&#121;&#64;&#103;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;">17bity@gmail.com</a>",<br />
　homepage:"<a href="http://www.jialing.net/">http://www.jialing.net</a>"<br />
},<br />
{<br />
　name:"John",<br />
　email:"<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#106;&#111;&#104;&#110;&#64;&#103;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;">john@gmail.com</a>",<br />
　homepage:"<a href="http://www.jobn.com/">http://www.jobn.com</a>"<br />
},<br />
{<br />
　name:"Peggy",<br />
　email:"<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#112;&#101;&#103;&#103;&#121;&#64;&#103;&#109;&#97;&#105;&#108;&#46;&#99;&#111;&#109;">peggy@gmail.com</a>",<br />
　homepage:"<a href="http://www.peggy.com/">http://www.peggy.com</a>"<br />
}<br />
]<br />
<img alt="" src="file:///D:/Program%20Files/鱼鱼多媒体日记本/temp/{DAABF217-D499-4CBF-84ED-BDEBA0BB6A49}_None[1].gif" align="top" /></span></div>
</div>
</div>
</div>
</font>
 <img src ="http://www.blogjava.net/tianya0801/aggbug/193161.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tianya0801/" target="_blank">未知数据</a> 2008-04-15 17:23 <a href="http://www.blogjava.net/tianya0801/archive/2008/04/15/193161.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个很有意思的IOC介绍</title><link>http://www.blogjava.net/tianya0801/archive/2008/03/03/183407.html</link><dc:creator>未知数据</dc:creator><author>未知数据</author><pubDate>Mon, 03 Mar 2008 03:08:00 GMT</pubDate><guid>http://www.blogjava.net/tianya0801/archive/2008/03/03/183407.html</guid><wfw:comment>http://www.blogjava.net/tianya0801/comments/183407.html</wfw:comment><comments>http://www.blogjava.net/tianya0801/archive/2008/03/03/183407.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tianya0801/comments/commentRss/183407.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tianya0801/services/trackbacks/183407.html</trackback:ping><description><![CDATA[<div align="left"><font face="宋体" size="2">
<div class="storyTitle">介绍 IOC（转） </div>
<div class="storytext"><span class="f141">
<p>
<p>作者：冰云 icecloud(AT)sina.com BLOG: http://icecloud.51.net 时间：2004.02.15<br />
<br />
版权声明：本文由冰云完成，首发于CSDN，作者保留中文版权。未经许可，不得使用于任何商业用途。欢迎转载，但请保持文章及版权声明完整。如需联络请发邮件：icecloud(AT)sina.com</p>
<p><strong>一、IOC</strong><br />
<br />
IoC就是Inversion of Control，控制反转。在Java开发中，IoC意味着将你设计好的类交给系统去控制，而不是在你的类内部控制。这称为控制反转。 </p>
</span><br />
<p>下面我们以几个例子来说明什么是IoC。假设我们要设计一个Girl和一个Boy类，其中Girl有kiss方法，即Girl想要Kiss一个Boy。那么，我们的问题是，Girl如何能够认识这个Boy？<br />
</p>
<p align="center"><img hspace="0" src="file:///D:/Program%20Files/鱼鱼多媒体日记本/temp/{0223F75D-5AC7-4AE6-963E-52A6697D032F}_20063814639516[1].gif" border="0"  alt="" /></p>
</img /><br />
<br />
在我们中国，常见的ＭＭ与GG的认识方式有以下几种：1青梅竹马；2亲友介绍；3父母包办。 那么哪一种才是最好呢？<br />
<br />
青梅竹马：Girl从小就知道自己的Boy。 <br />
<br />
<p align="center"><img hspace="0" src="file:///D:/Program%20Files/鱼鱼多媒体日记本/temp/{0AB7B840-F631-4EEF-920D-F1F634B1CC6D}_20063814639891[1].gif" border="0"  alt="" /></p>
</img /><br />
<br />
public class Girl { <br />
<br />
void kiss(){<br />
<br />
Boy boy = new Boy();<br />
<br />
}<br />
<br />
}<br />
<br />
然而从开始就创建的Boy缺点就是无法在更换。并且要负责Boy的整个生命周期。如果我们的Girl想要换一个怎么办？（笔者严重不支持Girl经常更换Boy） <br />
<br />
亲友介绍：由中间人负责提供Boy来见面<br />
<br />
<p align="center"><img hspace="0" src="file:///D:/Program%20Files/鱼鱼多媒体日记本/temp/{43EB9F93-8121-43B7-B386-3CC23019420B}_20063814639679[1].gif" border="0"  alt="" /></p>
<p></img /><br />
<br />
<br />
<br />
public class Girl {<br />
<br />
void kiss(){<br />
<br />
Boy boy = BoyFactory.createBoy(); <br />
<br />
}<br />
<br />
}<br />
<br />
亲友介绍，固然是好。如果不满意，尽管另外换一个好了。但是，亲友BoyFactory经常是以Singleton的形式出现，不然就是，存在于Globals，无处不在，无处不能。实在是太繁琐了一点，不够灵活。我为什么一定要这个亲友掺和进来呢？为什么一定要付给她介绍费呢？万一最好的朋友爱上了我的男朋友呢？ <br />
<br />
父母包办：一切交给父母，自己不用费吹灰之力，只需要等着Kiss就好了。<br />
<br />
public class Girl {<br />
<br />
void kiss(Boy boy){<br />
<br />
// kiss boy <br />
<br />
boy.kiss();<br />
<br />
}<br />
<br />
}<br />
<br />
<br />
<br />
Well，这是对Girl最好的方法，只要想办法贿赂了Girl的父母，并把Boy交给他。那么我们就可以轻松的和Girl来Kiss了。看来几千年传统的父母之命还真是有用哦。至少Boy和Girl不用自己瞎忙乎了。<br />
<br />
这就是IOC，将对象的创建和获取提取到外部。由外部容器提供需要的组件。 <br />
<br />
我们知道好莱坞原则：&#8220;Do not call us, we will call you.&#8221; 意思就是，You, girlie, do not call the boy. We will feed you a boy。 <br />
<br />
我们还应该知道依赖倒转原则即 Dependence Inversion Princinple，DIP。Eric Gamma说，要面向抽象编程。面向接口编程是面向对象的核心。</p>
<p align="center"><img hspace="0" src="file:///D:/Program%20Files/鱼鱼多媒体日记本/temp/{453A961D-C179-413B-ACF6-2949FD11E16A}_20063814640232[1].gif" border="0"  alt="" /></p>
</img />
<p><br />
<br />
组件应该分为两部分，即Service, 所提供功能的声明Implementation, Service的实现好处是：多实现可以任意切换，防止 &#8220;everything depends on everything&#8221; 问题．即具体依赖于具体。<br />
<br />
所以，我们的Boy应该是实现Kissable接口。这样一旦Girl不想kiss可恶的Boy的话，还可以kiss可爱的kitten和慈祥的grandmother。<br />
<br />
</img /><br />
<br />
</p>
<p><strong>二、IOC的type</strong><br />
<br />
IoC的Type指的是Girl得到Boy的几种不同方式。我们逐一来说明。
<p>
<p>IOC type 0：不用IOC<br />
<br />
public class Girl implements Servicable {<br />
<br />
private Kissable kissable;<br />
<br />
public Girl() {<br />
<br />
kissable = new Boy();<br />
<br />
}<br />
<br />
public void kissYourKissable() {<br />
<br />
kissable.kiss();<br />
<br />
}<br />
<br />
}</p>
<p>Girl自己建立自己的Boy，很难更换，很难共享给别人，只能单独使用，并负责完全的生命周期。<br />
<br />
IOC type 1，先看代码：<br />
<br />
public class Girl implements Servicable {<br />
<br />
Kissable kissable;<br />
<br />
public void service(ServiceManager mgr) {<br />
<br />
kissable = (Kissable) mgr.lookup(&#8220;kissable&#8221;);<br />
<br />
}<br />
<br />
public void kissYourKissable() {<br />
<br />
kissable.kiss();<br />
<br />
}<br />
<br />
}</p>
<p>这种情况出现于Avalon Framework。一个组件实现了Servicable接口，就必须实现service方法，并传入一个ServiceManager。其中会含有需要的其它组件。只需要在service方法中初始化需要的Boy。另外，J2EE中从Context取得对象也属于type 1，它依赖于配置文件： <br />
<br />
<configuration />&#8230; </configuration /><br />
<br />
IOC type 2：<br />
<br />
public class Girl {<br />
<br />
private Kissable kissable;<br />
<br />
public void setKissable(Kissable kissable) {<br />
<br />
this.kissable = kissable;<br />
<br />
}<br />
<br />
public void kissYourKissable() {<br />
<br />
kissable.kiss();<br />
<br />
}<br />
<br />
}<br />
<br />
Type 2出现于Spring Framework，是通过JavaBean的set方法来将需要的Boy传递给Girl。它必须依赖于配置文件。<br />
</beans /><br />
<br />
IOC type 3<br />
<br />
public class Girl {<br />
<br />
private Kissable kissable;<br />
<br />
public Girl(Kissable kissable) {<br />
<br />
this.kissable = kissable;<br />
<br />
}<br />
<br />
public void kissYourKissable() {<br />
<br />
kissable.kiss();<br />
<br />
}<br />
<br />
}<br />
<br />
这就是PicoContainer的组件 。通过构造函数传递Boy给Girl。<br />
<br />
<br />
<br />
PicoContainer container = new DefaultPicoContainer();<br />
<br />
container.registerComponentImplementation(Boy.class);<br />
<br />
container.registerComponentImplementation(Girl.class);<br />
<br />
Girl girl = (Girl) container.getComponentInstance(Girl.class);<br />
<br />
girl.kissYourKissable();</p>
<p>（注：全文完，后面作者语和文章参考资料）<br />
<br />
</p>
<p>作者语： <br />
<br />
Well，以上的这些理论部分有些已经有了新的定义了。过些天我会再写一些文章具体说明。比如，原来的三种type结构现在已经重新定义为依赖注射的许多层次。<br />
<br />
IoC很年轻，还在发展。伴随着IOC的发展，AOP，COP，SOP等等都在不断的发展。作为程序员，随时关注着新的思想的发展是一件很轻松愉快的事情。有没有人愿意和我一起探讨学习共同进步呀！ <br />
<br />
参考资料<br />
<br />
1 本文主要插图及文字来源于ThoughtWorks公司的Jon Tirs&#233;n 与 Aslak Helles&#248;y（PicoContainer的两位开发者），2003年在Java Polis的演讲PPT。有删改。<br />
<br />
http://www.picocontainer.org/presentations/JavaPolis2003.ppt<br />
<br />
http://www.picocontainer.org/presentations/JavaPolis2003.pdf<br />
<br />
2 DIP， Robert C Martin, Bob大叔的优秀论文<br />
<br />
http://www.objectmentor.com/resources/articles/dip.pdf<br />
<br />
3 Dependency Injection　依赖注射，Matrin Fowler对DIP的扩展<br />
<br />
http://www.martinfowler.com/articles/injection.html
<p>
<p>4 IOC框架<br />
<br />
PicoContainer 优秀的IOC框架<br />
<br />
http://picocontainer.org/<br />
<br />
Avalon<br />
<br />
http://avalon.apache.org/<br />
<br />
Spring Framework<br />
<br />
http://www.springframework.org/<br />
<br />
HiveMind<br />
<br />
http://jakarta.apache.org/commons/hivemind<br />
<br />
5 中文资料<br />
<br />
程序匠：国内研究Pico的先驱<br />
<br />
http://douleimi.vicp.net/space/start<br />
<br />
Jdon：板桥也在研究<br />
<br />
http://www.jdon.com/design.htm<br />
<br />
Spring　Framework中文论坛<br />
<br />
http://xglw.51.net/5team/springframework/index.php<br />
<br />
Avalon 中文资料<br />
<br />
http://www.huihoo.org/apache/avalon/introduction.html<br />
<br />
ERPROAD <br />
<br />
http://www.erproad.org/index.asp?vt=bycat&amp;cat_id=37<br />
<br />
Open Heart <br />
<br />
http://blogbus.com/blogbus/blog/index.php?blogid=2529&amp;cat=5</p>
</div>
</font></div>
<img src ="http://www.blogjava.net/tianya0801/aggbug/183407.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tianya0801/" target="_blank">未知数据</a> 2008-03-03 11:08 <a href="http://www.blogjava.net/tianya0801/archive/2008/03/03/183407.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring2.0--使用模板装配</title><link>http://www.blogjava.net/tianya0801/archive/2008/02/29/182957.html</link><dc:creator>未知数据</dc:creator><author>未知数据</author><pubDate>Fri, 29 Feb 2008 08:02:00 GMT</pubDate><guid>http://www.blogjava.net/tianya0801/archive/2008/02/29/182957.html</guid><wfw:comment>http://www.blogjava.net/tianya0801/comments/182957.html</wfw:comment><comments>http://www.blogjava.net/tianya0801/archive/2008/02/29/182957.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tianya0801/comments/commentRss/182957.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tianya0801/services/trackbacks/182957.html</trackback:ping><description><![CDATA[
<p style="TEXT-ALIGN: left">使用模板装配</p>
<p style="TEXT-ALIGN: left">如果需要装配大量的同一类型的Bean,而这些Bean都有一些相同的属性,可以使用模板来装配Bean.</p>
<div style="TEXT-ALIGN: left">
<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="COLOR: #000000">package example.chapter3;</span></div>
<div><span style="COLOR: #000000">import java.io.Serializable;</span></div>
<div><span style="COLOR: #000000">public class Employee implements Serializable {</span></div>
<div><span style="COLOR: #000000">private String name;<br/>private String title;<br/>private String company;<br/>private String department;</span></div>
<div><span style="COLOR: #000000">public String getName() { return name; }<br/>public void setName(String name) { this.name = name; }</span></div>
<div><span style="COLOR: #000000">public String getTitle() { return title; }<br/>public void setTitle(String title) { this.title = title; }</span></div>
<div><span style="COLOR: #000000">public String getCompany() { return company; }<br/>public void setCompany(String company) { this.company = company; }</span></div>
<div><span style="COLOR: #000000">public String getDepartment() { return department; }<br/>public void setDepartment(String department) { this.department = department; }</span></div>
<div><span style="COLOR: #000000">}<br/><br/><img width="11" align="top" height="16" src="file:///D:/Program%20Files/%E9%B1%BC%E9%B1%BC%E5%A4%9A%E5%AA%92%E4%BD%93%E6%97%A5%E8%AE%B0%E6%9C%AC/temp/{20916803-6DEF-48F8-8F31-3908124782AF}_None[2].gif"/></span></div>
</div>
</div>
<div style="TEXT-ALIGN: left">xml配置文件</div>
<br/><div style="TEXT-ALIGN: left">
<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="COLOR: #000000">&lt;bean id="abstractEmployee" class="java.io.Serializable" <strong>abstract</strong>="true"&gt;<br/>&lt;property name="company" value="Inc." /&gt;<br/>&lt;property name="department" value="Center" /&gt;<br/>&lt;/bean&gt;</span></div>
<div><span style="COLOR: #000000">&lt;bean id="engineer1" class="example.chapter3.Employee" <strong>parent</strong>="abstractEmployee"&gt;<br/>&lt;property name="name" value="Bill" /&gt;<br/>&lt;property name="title" value="Software Engineer" /&gt;<br/>&lt;/bean&gt;</span></div>
<div><span style="COLOR: #000000">&lt;bean id="engineer2" class="example.chapter3.Employee" parent="abstractEmployee"&gt;<br/>&lt;property name="name" value="Steven" /&gt;<br/>&lt;property name="title" value="Hardware Engineer" /&gt;<br/>&lt;/bean&gt;</span></div>
<div><span style="COLOR: #000000">&lt;bean id="manager" class="example.chapter3.Employee" parent="abstractEmployee"&gt;<br/>&lt;property name="name" value="Michael" /&gt;<br/>&lt;property name="title" value="Manager" /&gt;<br/><strong>&lt;property name="department" value="HR" /&gt;</strong><br/>&lt;/bean&gt;<br/><img width="11" align="top" height="16" src="file:///D:/Program%20Files/%E9%B1%BC%E9%B1%BC%E5%A4%9A%E5%AA%92%E4%BD%93%E6%97%A5%E8%AE%B0%E6%9C%AC/temp/{75D8EEB7-1312-44CC-B144-A131D8549AC2}_None[2].gif"/></span></div>
</div>
</div>
<div style="TEXT-ALIGN: left">1.指定abstract="true"表示这个Bean只作为模板使用,Spring容器不会对标记为abstract的Bean创建实例,也不会检查其属性是否合法.因此可以随意注入任何属性</div>
<div style="TEXT-ALIGN: left">2.下面创建的engineer1,engineer2,engineer3指定<strong>parent</strong>="abstractEmployee,将自动继承abstractEmployee的company和department属性.同时子类也可以覆盖模板中的属性,比如engineer3</div>
<br/><img src ="http://www.blogjava.net/tianya0801/aggbug/182957.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tianya0801/" target="_blank">未知数据</a> 2008-02-29 16:02 <a href="http://www.blogjava.net/tianya0801/archive/2008/02/29/182957.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring2.0--自动装配</title><link>http://www.blogjava.net/tianya0801/archive/2008/02/29/182880.html</link><dc:creator>未知数据</dc:creator><author>未知数据</author><pubDate>Fri, 29 Feb 2008 03:54:00 GMT</pubDate><guid>http://www.blogjava.net/tianya0801/archive/2008/02/29/182880.html</guid><wfw:comment>http://www.blogjava.net/tianya0801/comments/182880.html</wfw:comment><comments>http://www.blogjava.net/tianya0801/archive/2008/02/29/182880.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tianya0801/comments/commentRss/182880.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tianya0801/services/trackbacks/182880.html</trackback:ping><description><![CDATA[
<p style="TEXT-ALIGN: left">spring2.0之自动装配</p>
<p style="TEXT-ALIGN: left">Bar.java</p>
<div style="TEXT-ALIGN: left">
<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="COLOR: #000000">public class Bar {<br/><br/>}</span></div>
</div>
</div>
<p style="TEXT-ALIGN: left">Foo.java</p>
<div style="TEXT-ALIGN: left">
<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="COLOR: #000000">public class Foo {<br/><br/>}</span></div>
</div>
</div>
<br/><div style="TEXT-ALIGN: left">SimpleTest.java</div>
<div style="TEXT-ALIGN: left">
<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="COLOR: #000000">public class SimpleTest {<br/>private Foo foo;<br/>private Foo foo2;<br/>private Bar bar;<br/>public SimpleTest(){<br/><br/>}<br/>public SimpleTest(Foo foo, Bar bar) {<br/>System.out.println("constructor bar,foo call");<br/>this.foo = foo;<br/>this.bar = bar;<br/>}<br/>public SimpleTest(Foo foo) {<br/>System.out.println("constructor foo call");<br/>this.foo = foo;<br/>}<br/>public Bar getBar() {<br/>return bar;<br/>}<br/>public void setBar(Bar bar) {<br/>System.out.println("property bar set");<br/>this.bar = bar;<br/>}<br/>public Foo getFoo() {<br/>return foo;<br/>}<br/>public void setFoo(Foo foo) {<br/>System.out.println("property foo set");<br/>this.foo = foo;<br/>}<br/>public Foo getFoo2() {<br/>return foo2;<br/>}<br/>public void setFoo2(Foo foo2) {<br/>System.out.println("property foo2 set");<br/>this.foo2 = foo2;<br/>}<br/><br/>}<br/></span></div>
</div>
</div>
<br/><div style="TEXT-ALIGN: left">xml配置文件:</div>
<div style="TEXT-ALIGN: left">
<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="COLOR: #000000">&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br/>&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"<br/>"<a href="http://www.springframework.org/dtd/spring-beans.dtd">http://www.springframework.org/dtd/spring-beans.dtd</a>"&gt;</span></div>
<div><span style="COLOR: #000000">&lt;beans&gt;<br/>&lt;!-- 定义foo和bar --&gt;<br/>&lt;bean id="foo" class="Foo"/&gt;<br/>&lt;bean id="bar" class="Bar"/&gt;<br/><br/>&lt;!-- 使用ByName方式装配，这种方式的原理是如果目标bean有一个名为foo的属性而bean工厂有一个同名的bean,则把这个bean装配给目标bean的属性 <strong>Spring容器查找与SimpleTest属性名称(即foo和bar)相同的Bean,然后自动注入到该属性中,否则不会注入</strong> --&gt;<br/>&lt;bean id="simpleTest1" class="SimpleTest" autowire="byName"/&gt;<br/><br/>&lt;!-- 使用ByType方式装配,这种方式的原理是如果目标bean的属性类型和bean工厂中的一个bean的类型相府，则把这个bean装配给目标bean,如果对于一个相符，则出现异常 <strong>Spring容器查找与SimpleTest属性的设值方法参数类型(即Foo和Bar)兼容的Bean</strong> --&gt;<br/>&lt;bean id="simpleTest2" class="SimpleTest" autowire="byType"/&gt;<br/><br/>&lt;!-- 使用constructor方式，这种方式的原理是最大数量的匹配目标bean的构造方法，如果目标bean有一个String的构造方法，一个String和int的构造方法 bean工厂中也有string和int两个bean,则spring会装配String和int的构造方法</span></div>
<div><span style="COLOR: #000000"><strong>Spring容器将试图找出所有与构造方法的参数类型兼容的Bean</strong><br/>--&gt;<br/>&lt;bean id="simpleTest3" class="SimpleTest" autowire="constructor"/&gt;<br/><br/>&lt;!-- 自动装配方式，这种方式会自动在byType和Constructor中自动匹配，当目标bean有一个无参（本例）构造方法是，spring会选择使用byType方式 --&gt;<br/>&lt;bean id="simpleTest4" class="SimpleTest" autowire="autodetect"/&gt;<br/>&lt;/beans&gt;<br/></span></div>
</div>
</div>
<div style="TEXT-ALIGN: left">测试:</div>
<br/><div style="TEXT-ALIGN: left">
<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="COLOR: #000000">import java.io.File;<br/>import java.util.Iterator;<br/>import java.util.List;<br/>import java.util.Map;<br/>import java.util.Properties;<br/>import java.util.Set;</span></div>
<div><span style="COLOR: #000000">import org.springframework.beans.factory.BeanFactory;<br/>import org.springframework.beans.factory.support.BeanDefinitionRegistry;<br/>import org.springframework.beans.factory.xml.XmlBeanFactory;<br/>import org.springframework.core.io.FileSystemResource;<br/></span></div>
<div><span style="COLOR: #000000">public class TestSpring {<br/>public static void main(String args[]) throws Exception{<br/>//获取bean factory<br/>BeanFactory factory=(BeanFactory)getBeanFactory();<br/>SimpleTest simpleTest=null;<br/>System.out.println("use byName：");<br/>simpleTest=(SimpleTest)factory.getBean("simpleTest1");<br/>System.out.println("use byType：");<br/>simpleTest=(SimpleTest)factory.getBean("simpleTest2");<br/>System.out.println("use byContructor：");<br/>simpleTest=(SimpleTest)factory.getBean("simpleTest3");<br/>System.out.println("use byAuto：");<br/>simpleTest=(SimpleTest)factory.getBean("simpleTest4");<br/>}<br/>public static BeanDefinitionRegistry getBeanFactory() {<br/>//获取bean factory<br/>String realpath="";<br/>//加载配置项<br/>realpath=System.getProperty("user.dir")+File.separator+"src"+File.separator+File.separator+"beans.xml";<br/>XmlBeanFactory factory=new XmlBeanFactory(new FileSystemResource(realpath));<br/><br/>return factory;<br/>}<br/>}<br/></span></div>
</div>
</div>
<p style="TEXT-ALIGN: left">结果:</p>
<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="COLOR: #000000">2008-2-29 10:26:04 org.springframework.core.CollectionFactory &lt;clinit&gt;<br/>信息: JDK 1.4+ collections available<br/>2008-2-29 10:26:04 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions<br/>信息: Loading XML bean definitions from file [D:\MyWork\AutoWire\src\beans.xml]<br/>use byName：<br/>property bar set<br/>property foo set<br/>property foo2 set<br/>use byType：<br/>property bar set<br/>property foo set<br/>property foo2 set<br/>use byContructor：<br/>constructor bar,foo call<br/>use byAuto：<br/>property bar set<br/>property foo set<br/>property foo2 set<br/></span></div>
</div>
<p style="TEXT-ALIGN: left">Trackback: <a href="http://tb.blog.csdn.net/TrackBack.aspx?PostId=1675871">http://tb.blog.csdn.net/TrackBack.aspx?PostId=1675871</a></p>
<p style="TEXT-ALIGN: left"><br/></p>
<img src ="http://www.blogjava.net/tianya0801/aggbug/182880.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tianya0801/" target="_blank">未知数据</a> 2008-02-29 11:54 <a href="http://www.blogjava.net/tianya0801/archive/2008/02/29/182880.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring2.0--配置工厂Bean</title><link>http://www.blogjava.net/tianya0801/archive/2008/02/28/182652.html</link><dc:creator>未知数据</dc:creator><author>未知数据</author><pubDate>Thu, 28 Feb 2008 04:30:00 GMT</pubDate><guid>http://www.blogjava.net/tianya0801/archive/2008/02/28/182652.html</guid><wfw:comment>http://www.blogjava.net/tianya0801/comments/182652.html</wfw:comment><comments>http://www.blogjava.net/tianya0801/archive/2008/02/28/182652.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tianya0801/comments/commentRss/182652.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tianya0801/services/trackbacks/182652.html</trackback:ping><description><![CDATA[
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em; FONT-FAMILY: 宋体">配置工厂Bean</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em">通常由应用程序直接使用new创建新的对象,为了将对象的创建和使用相分离,采用工厂模式,即应用程序将对象的创建及初始化职责交给工厂对象.</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em">一般情况下,应用程序有自己的工厂对象来创建bean.如果将应用程序自己的工厂对象交给Spring管理,那么Spring管理的就不是普通的bean,而是工厂Bean.</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em">调用getBean()方法,Spring返回的不是直接创建的Bean的实例,而是<span style="COLOR: #ff0000">由工厂Bean创建的Bean实例.</span></span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em; COLOR: #ff0000"><span style="COLOR: #000000">一般在Spring中配置工厂Bean,有3中不同类型的工厂Bean的配置.</span></span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em">1.静态工厂</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em">创建具体Bean实例的是静态方法</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em"><br/></span>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em"><span style="FONT-SIZE: 0.75em; COLOR: #0000ff">import java.util.Random;</span></span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em; COLOR: #0000ff">public class StaticFactoryBean {</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em; COLOR: #0000ff">public static Integer createRandom() {</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em; COLOR: #0000ff">return new Integer(new Random().nextInt());<br/>}<br/>}</span></div>
<div style="TEXT-ALIGN: left">将其纳入Spring容器来管理,需要通过factory-method指定静态方法名称</div>
<div style="TEXT-ALIGN: left"><span style="COLOR: #0000ff">&lt;bean id="random"<br/>class="example.chapter3.StaticFactoryBean"<br/><strong>factory-method="createRandom"</strong> //createRandom方法必须是static的,才能找到<br/>scope="prototype"<br/>/&gt;</span></div>
<div style="TEXT-ALIGN: left">测试:</div>
<div style="TEXT-ALIGN: left"><span style="COLOR: #0000ff">public static void main(String[] args) {<br/><br/>XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("config.xml"));<br/>System.out.println(factory.getBean("random").toString());</span></div>
<div style="TEXT-ALIGN: left"><span style="COLOR: #0000ff">//StaticFactoryBean sfb = (StaticFactoryBean)factory.getBean("random");<br/>//System.out.println(sfb.createRandom().toString());</span></div>
<div style="TEXT-ALIGN: left"><span style="COLOR: #0000ff">//调用getBean()时,返回随机数.如果没有指定<strong>factory-method,</strong>会返回StaticFactoryBean的实例,即返回工厂Bean的实例<br/>}</span></div>
<br/><div style="TEXT-ALIGN: left">2.实例工厂</div>
<div style="TEXT-ALIGN: left">创建具体Bean实例的是实例,不是静态方法</div>
<br/><div style="TEXT-ALIGN: left"><span style="COLOR: #0000ff">import java.text.SimpleDateFormat;<br/>import java.util.Date;</span></div>
<div style="TEXT-ALIGN: left"><span style="COLOR: #0000ff">public class InstanceFactoryBean {</span></div>
<div style="TEXT-ALIGN: left"><span style="COLOR: #0000ff">private String format = "yy-MM-dd HH:mm:ss";</span></div>
<div style="TEXT-ALIGN: left"><span style="COLOR: #0000ff">public void setFormat(String format) {<br/>this.format = format;<br/>}</span></div>
<div style="TEXT-ALIGN: left"><span style="COLOR: #0000ff">public String createTime() {<br/>return new SimpleDateFormat(format).format(new Date());<br/>}<br/>}</span></div>
<div style="TEXT-ALIGN: left">配置文件需要配置两个bean:第一个Bean和普通的Bean没有区别,第二个bean定义如何通过工厂Bean获取Bean,需要指定<strong>工厂Bean的名称和方法名称</strong></div>
<div style="TEXT-ALIGN: left"><span style="COLOR: #0000ff">&lt;bean id="instanceFactoryBean" class="example.chapter3.InstanceFactoryBean"&gt;<br/>&lt;property name="format" value="yyyy-MM-dd HH:mm:ss" /&gt;<br/>&lt;/bean&gt;</span></div>
<div style="TEXT-ALIGN: left"><span style="COLOR: #0000ff">&lt;bean id="currentTime"<br/><strong>factory-bean</strong>="instanceFactoryBean"<br/><strong>factory-method</strong>="createTime"<br/>/&gt;</span></div>
<div style="TEXT-ALIGN: left">测试:</div>
<div style="TEXT-ALIGN: left"><span style="COLOR: #0000ff">public static void main(String[] args) {<br/><br/>XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("config.xml"));<br/>System.out.println(factory.getBean("currentTime"));<br/><br/>}</span></div>
<div style="TEXT-ALIGN: left">3.实现FactoryBean接口</div>
<div style="TEXT-ALIGN: left"><span style="COLOR: #0000ff">public class PiFactoryBean implements FactoryBean {</span></div>
<div style="TEXT-ALIGN: left"><span style="COLOR: #0000ff">public Object getObject() throws Exception {<br/>return new Double(3.14159265358979);<br/>}</span></div>
<div style="TEXT-ALIGN: left"><span style="COLOR: #0000ff">public Class getObjectType() {<br/>return Double.class;<br/>}</span></div>
<div style="TEXT-ALIGN: left"><span style="COLOR: #0000ff">public boolean isSingleton() {<br/>return true;<br/>}</span></div>
<div style="TEXT-ALIGN: left"><span style="COLOR: #0000ff">}</span></div>
<div style="TEXT-ALIGN: left">实现了FactoryBean接口的Bean,不再被视为普通的Bean.Spring会自动检测.</div>
<div style="TEXT-ALIGN: left"><span style="COLOR: #0000ff">&lt;bean id="pi" class="example.chapter3.PiFactoryBean" /&gt;</span></div>
<div style="TEXT-ALIGN: left">测试</div>
<div style="TEXT-ALIGN: left"><span style="COLOR: #0000ff">public static void main(String[] args) throws Exception {<br/><br/>XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("config.xml"));<br/>System.out.println(factory.getBean("pi"));//返回PiFactoryBean 的工厂方法getObject返回的Double对象实例<br/>//PiFactoryBean p = (PiFactoryBean)factory.getBean("&amp;pi"); //加"&amp;"返回工厂Bean的实例.<br/>//System.out.println(p.getObject());<br/>}</span></div>
<br/></div>
<img src ="http://www.blogjava.net/tianya0801/aggbug/182652.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tianya0801/" target="_blank">未知数据</a> 2008-02-28 12:30 <a href="http://www.blogjava.net/tianya0801/archive/2008/02/28/182652.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring2.0--笔记2</title><link>http://www.blogjava.net/tianya0801/archive/2008/02/25/181995.html</link><dc:creator>未知数据</dc:creator><author>未知数据</author><pubDate>Mon, 25 Feb 2008 06:33:00 GMT</pubDate><guid>http://www.blogjava.net/tianya0801/archive/2008/02/25/181995.html</guid><wfw:comment>http://www.blogjava.net/tianya0801/comments/181995.html</wfw:comment><comments>http://www.blogjava.net/tianya0801/archive/2008/02/25/181995.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tianya0801/comments/commentRss/181995.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tianya0801/services/trackbacks/181995.html</trackback:ping><description><![CDATA[
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em; FONT-FAMILY: 宋体">第三章:Ioc容器</span></div>
<div style="TEXT-ALIGN: left"/>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em"><strong>3.2.1 容器的概念</strong></span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em">Spring容器提供的功能主要包括</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em">1.组件的生命周期管理</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em">2.组件的配置和组装服务</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em">3.AOP支持</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em">4.建立在AOP之上的声明式事物服务</span></div>
<div style="TEXT-ALIGN: left"/>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em"><strong>3.2.2 IoC的概念</strong></span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em">IoC inversion of Control 控制反转</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em">public class BookService {</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em">private BookDao bookDao = new DbBookDao();</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em">public List&lt;Book&gt; listBooksByAuthor(String author) {</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em">List&lt;Book&gt; books = bookDao.listAll();</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em">Iterator&lt;Book&gt; it = books.iterator();</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em">while(it.hasNext()) {</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em">if(!it.next().getAuthor().equals(author)) {</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em">it.remove();</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em">}</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em">}</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em">return books;</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em">}</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em">}</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em">如果系统中有很多组件,其生命周期和相互之间的依赖关系如果由组件自己来维护,不但大大增加了系统的复杂程度,而且导致组件组件很紧的耦合,继而给测试和维护带来很大困难.</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em">在Ioc模式下,控制权发生了反转.组件不再由应用程序来创建和配置,而是由Ioc容器来负责,应用程序只是直接使用已经创建和配置好的组件.</span></div>
<div style="TEXT-ALIGN: left"/>
<div style="TEXT-ALIGN: left">
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em"><span style="FONT-SIZE: 0.75em">public class BookService {</span></span></div>
<div style="TEXT-ALIGN: left">private BookDao bookDao;</div>
<div style="TEXT-ALIGN: left">public void setBookDao(BookDao bookDao){</div>
<div style="TEXT-ALIGN: left">this.bookDao=bookDao;</div>
<div style="TEXT-ALIGN: left">}</div>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em">public List&lt;Book&gt; listBooksByAuthor(String author) {</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em">List&lt;Book&gt; books = bookDao.listAll();</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em">Iterator&lt;Book&gt; it = books.iterator();</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em">while(it.hasNext()) {</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em">if(!it.next().getAuthor().equals(author)) {</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em">it.remove();</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em">}</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em">}</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-SIZE: 0.75em">return books;</span></div>
<div style="TEXT-ALIGN: left">上面没有创建组件bookDao的代码,只有使用组件.从而实现了组件的配置和使用的分离,并由Ioc容器负责管理组件的生命周期.</div>
<br/><div style="TEXT-ALIGN: left"><strong>3.2.3 依赖注入的方式</strong></div>
<div style="TEXT-ALIGN: left">为了让组件能在IoC容器中被装配出来,需要某种注入机制,Ioc使用"注入"机制将一种组件注入到另一种组件中.</div>
<div style="TEXT-ALIGN: left">Type1:接口注入</div>
<div style="TEXT-ALIGN: left">Type2:设置属性注入</div>
<div style="TEXT-ALIGN: left">Type3:构造方法注入</div>
<div style="TEXT-ALIGN: left"><strong>3.3 Spring提供的IoC容器</strong></div>
<div style="TEXT-ALIGN: left">1.高扩展性<strong>无侵入式</strong>的框架</div>
<div style="TEXT-ALIGN: left">2.支持两种依赖注入方式:设置属性注入和构造方法注入.</div>
<div style="TEXT-ALIGN: left">3.提供两种不同的容器:BeanFactory和ApplicationContext</div>
<div style="TEXT-ALIGN: left"><strong>3.3.1 BeanFactory</strong></div>
<div style="TEXT-ALIGN: left">应用程序将Bean的创建和配置全部委托给BeanFactory,然后从BeanFactory获取Bean并使用Bean.流程如下:</div>
<div style="TEXT-ALIGN: left">启动应用程序--&gt;<strong>实例化BeanFactory</strong>--&gt;从BeanFactory中获取Bean--&gt;使用Bean--&gt;销毁BeanFactory--&gt;应用程序结束</div>
<br/><div style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 新宋体"><strong>org.springframework.beans.factory.BeanFactory</strong>的具体实现:</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 新宋体">XmlBeanFactory 通过一个xml文件创建和配置Bean</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 新宋体">从本地文件中载入:</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 新宋体">InputStream is = new <span style="COLOR: #ff0000">FileInputStream</span>("beans.xml");</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 新宋体"><span style="COLOR: #ff0000">XmlBeanFactory</span> factory = new<span style="COLOR: #ff0000">XmlBeanFactory</span>(is);</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 新宋体">或者使用ClassPath定位:</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 新宋体">ClassPathResource res = new ClassPathResource("beans.xml");</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 新宋体">XmlBeanFactory factory = new XmlBeanFactory(res);</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 新宋体"><strong>3.3.2 使用ApplicationContext</strong></span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 新宋体">从BeanFactory继承而来,所以本质仍然是一个BeanFactory.与基本的BeanFactory相比,还提供了国际化支持,事件的发布和通知机制等</span></div>
<div style="TEXT-ALIGN: left"/>
<div style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 新宋体"><strong>3.4 bean初始化</strong></span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 新宋体">基本的BeanFactory初始化和ApplicationContext初始化不同:</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 新宋体">基本的BeanFactory在调用getBean("beanid")的时候才会创建这个bean</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 新宋体">ApplicationContext则在自身初始化的时候创建了所有bean</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 新宋体">因为ApplicationContext的特性,ApplicationContext是最佳选择.在启动的时候,可以检测配置文件出错.这比使用基本的BeanFactory在运行一段时间以后调用getBean()抛出异常要好得多.并且,演示加载会带来性能上的损失.ApplicationContext唯一的缺点是,由于要在启动的时候一次性创建所有bean.当定义的bean很多时,启动的时间比较长.</span></div>
<div style="TEXT-ALIGN: left"/>
<div style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 新宋体"><strong>3.5 装配bean</strong></span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 新宋体">装配Bean的方式就是在xml配置文件中对每个&lt;bean&gt;节点进行配置.</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 新宋体">______________________________________________________________________________</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 新宋体">public class ExampleBean {<br/>private List list;<br/>private int size = 100;<br/>private String version;</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 新宋体">private BasicBean basicBean;<br/><br/>public void setSize(int size) {<br/>this.size=size;<br/>}<br/>public void setVersion(String version) {<br/>this.version = version;<br/>}</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 新宋体">public void setBean(BasicBean basicBean) {</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 新宋体">this.basicBean = basicBean;</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 新宋体">}<br/>public void init() {<br/>list = new ArrayList(size);<br/>}<br/>}</span></div>
<div style="TEXT-ALIGN: left"/>
<div style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 新宋体">&lt;bean id="exampleBean" class="example.chapter3.ExampleBean" <strong>init-method</strong>="init"&gt;<br/>&lt;property name="size" value="10" /&gt;<br/>&lt;property name="version" value="1.0" /&gt;</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 新宋体">&lt;property name="bean" <strong>ref</strong>="basicBean" /&gt;</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 新宋体"><strong>&lt;property name="bean" &lt;null /&gt;&lt;/property&gt;</strong><br/>&lt;/bean&gt;</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 新宋体">1.init-method指定一个无参数的初始化方法</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 新宋体">2.基本类型的注入,Spring会自动将value的值转化为合适的类型.若无法完成,则抛出异常.</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 新宋体">3.如果注入的属性不是基本类型,而是引用类型,则用&lt;ref&gt;代替&lt;value&gt;.</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 新宋体">4.如果对某个属性注入null,则必须使用&lt;null/&gt;</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 新宋体">_________________________________________________________________________________________</span></div>
<div style="TEXT-ALIGN: left">public class ListBean {</div>
<div style="TEXT-ALIGN: left">public void setChildren(List children){}//普通list<br/>public void setPrices(List&lt;Float&gt; prices) {}//泛型list<br/>public void setFi(int[] fi) {}//int数组<br/>}</div>
<div style="TEXT-ALIGN: left">&lt;bean id="listBean" class="example.chapter3.ListBean"&gt;<br/>&lt;property name="children"&gt;<br/>&lt;list&gt;<br/>&lt;value&gt;A String&lt;/value&gt;<br/><strong>&lt;ref bean="basicBean" /&gt;<br/></strong> &lt;/list&gt;<br/>&lt;/property&gt;<br/>&lt;property name="prices"&gt;<br/>&lt;list&gt;<br/>&lt;value&gt;1.24&lt;/value&gt;<br/>&lt;value&gt;2.24&lt;/value&gt;<br/>&lt;value&gt;3.24&lt;/value&gt;<br/>&lt;/list&gt;<br/>&lt;/property&gt;<br/>&lt;property name="fi"&gt;<br/>&lt;list&gt;<br/>&lt;value&gt;1&lt;/value&gt;<br/>&lt;value&gt;2&lt;/value&gt;<br/>&lt;value&gt;3&lt;/value&gt;<br/>&lt;value&gt;4&lt;/value&gt;<br/>&lt;value&gt;5&lt;/value&gt;<br/>&lt;/list&gt;<br/>&lt;/property&gt;<br/>&lt;/bean&gt;</div>
<div style="TEXT-ALIGN: left">1.设置list和数组的方法是在&lt;list&gt;和&lt;/list&gt;之间包含若干&lt;value&gt;或&lt;ref&gt;节点,可以混合使用&lt;value&gt;和&lt;ref&gt;</div>
<div style="TEXT-ALIGN: left">2.使用java5的泛型,Spring2.0可以强制将&lt;value&gt;的值转化为Float类型</div>
<div style="TEXT-ALIGN: left">3.set类型的注入和普通list相同,但set中不包含重复元素.</div>
<div style="TEXT-ALIGN: left">4.map的注入,每一项都是由一个键值和对应的值组成.例如:</div>
<div style="TEXT-ALIGN: left">public class MapBean {</div>
<div style="TEXT-ALIGN: left">public void setWeekday(Map map) {}<br/>}<br/></div>
<div style="TEXT-ALIGN: left">&lt;bean id="mapBean" class="example.chapter3.MapBean"&gt;<br/>&lt;property name="weekday"&gt;<br/>&lt;map&gt;<br/>&lt;entry key="Monday"&gt;<br/>&lt;value&gt;one&lt;/value&gt;<br/>&lt;/entry&gt;<br/>&lt;entry key="Tuesday"&gt;<br/>&lt;ref bean="listBean" /&gt;<br/>&lt;/entry&gt;<br/>&lt;/map&gt;<br/>&lt;/property&gt;<br/>&lt;/bean&gt;<br/>key也可以是任意的Object.<br/>&lt;bean id="mapBean" class="example.chapter3.MapBean"&gt;<br/>&lt;property name="weekday"&gt;<br/>&lt;map&gt;<br/>&lt;entry&gt;<br/>&lt;key&gt;&lt;ref bean="basicBean"&gt;&lt;/key&gt;<br/>&lt;value&gt;basic&lt;/value&gt;<br/>&lt;/entry&gt;<br/>&lt;entry&gt;<br/>&lt;key&gt;&lt;ref bean="basicBean"&gt;&lt;/key&gt;<br/>&lt;ref bean="setBean" /&gt;<br/>&lt;/entry&gt;<br/><br/>&lt;!--<br/>可简写成<br/>&lt;entry key-ref="basicBean" value="basic" /&gt;<br/>&lt;entry key-ref="listBean" value-ref="setBean" /&gt;<br/>--&gt;<br/>&lt;/map&gt;<br/>&lt;/property&gt;<br/>&lt;/bean&gt;</div>
<br/><div style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 新宋体"><strong>3.6 构造方法注入</strong></span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 新宋体">public class ConstructorBean {<br/>public ConstructorBean(int min,int max) {<br/>System.out.println("(int,int)");<br/>}<br/>public ConstructorBean(String min,String max) {<br/>System.out.println("(String,String)");<br/>}<br/>}</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 新宋体">&lt;bean id="constructorBean" class="example.chapter3.ConstructorBean"&gt;<br/>&lt;<strong>constructor-arg</strong> <strong>type</strong>="int" <strong>value</strong>="100"&gt;<br/>&lt;<strong>constructor-arg</strong> type="int" value="200"&gt;<br/>&lt;/bean&gt;</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 新宋体">1.使用type属性指定构造方法的参数类型</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 新宋体">2.推荐优先考虑设置属性方法注入</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 新宋体"><strong>3.7 bean的作用域</strong></span></div>
<div style="TEXT-ALIGN: left"><strong><span style="FONT-FAMILY: 新宋体">&lt;bean id="beanid" class="class" scope=""&gt;</span></strong></div>
<div style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 新宋体">spring2.0中一共定义了5中作用域:singleton,prototype,request,session,application.</span></div>
<div style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 新宋体">1.singleton</span></div>
<div style="TEXT-ALIGN: left">如果不指定scope,默认值为singleton.Spring的IoC容器仅为每个bean创建一个实例,并保持Bean的引用.也就是说每次调用getBean()方法请求某一bean 时,Spring总返回相同的Bean实例</div>
<div style="TEXT-ALIGN: left">2.prototype</div>
<div style="TEXT-ALIGN: left">每次都返回一个新创建的bean实例.因此,Spring容器一旦将实例交给客户端,就不再对其跟踪引用,所以不能对prototype作用域的Bean定义destroy-method.</div>
<br/><div style="TEXT-ALIGN: left">public static void main(String[] args) {<br/>ApplicationContext context = new ClassPathXmlApplicationContext("config.xml");<br/>System.out.println("Get date: "+context.getBean("date"));<br/>Thread.sleep(1000);<br/>System.out.println("Get date: "+context.getBean("date"));<br/>Thread.sleep(1000);<br/>System.out.println("Get date: "+context.getBean("date"));<br/>Thread.sleep(1000);<br/>}</div>
<br/><div style="TEXT-ALIGN: left">&lt;bean id="date" class="java.util.Date" scope="prototype" /&gt;</div>
<br/><div style="TEXT-ALIGN: left">打印出的时间是不同的,说明返回3个不同的date对象实例,如果去掉scope,则每次打印出的时间都是一样的.</div>
<br/><br/></div>
<img src ="http://www.blogjava.net/tianya0801/aggbug/181995.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tianya0801/" target="_blank">未知数据</a> 2008-02-25 14:33 <a href="http://www.blogjava.net/tianya0801/archive/2008/02/25/181995.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring2.0--笔记1</title><link>http://www.blogjava.net/tianya0801/archive/2008/02/25/181870.html</link><dc:creator>未知数据</dc:creator><author>未知数据</author><pubDate>Mon, 25 Feb 2008 00:35:00 GMT</pubDate><guid>http://www.blogjava.net/tianya0801/archive/2008/02/25/181870.html</guid><wfw:comment>http://www.blogjava.net/tianya0801/comments/181870.html</wfw:comment><comments>http://www.blogjava.net/tianya0801/archive/2008/02/25/181870.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tianya0801/comments/commentRss/181870.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tianya0801/services/trackbacks/181870.html</trackback:ping><description><![CDATA[
<div style="TEXT-ALIGN: left">
<div style="TEXT-ALIGN: left"><span style="FONT-FAMILY: 宋体"><span style="FONT-SIZE: 1em; FONT-FAMILY: 宋体">第一章:</span></span></div>
<div style="TEXT-ALIGN: left">1.1 spring介绍</div>
<div style="TEXT-ALIGN: left">Rod Johnson提出,抛弃了EJB的重量级组件,使用javaBean作为组件实现,轻量级框架.</div>
<div style="TEXT-ALIGN: left">spring是一个实现了AOP功能的Ioc容器.不同于ＥＪＢ,不需要全功能的javaEE服务器,它可以在仅支持web容器的javaEE服务器上,或者直接在普通的main()中启动.</div>
<div style="TEXT-ALIGN: left">第二章:</div>
<div style="TEXT-ALIGN: left">1.1 resin安装</div>
<div style="TEXT-ALIGN: left">resin3.1安装报错:Can't find java executable in d:\jdk1.5</div>
<div style="TEXT-ALIGN: left">Couldn't start "(null)" -classpath</div>
<div style="TEXT-ALIGN: left">原因:</div>
<div style="TEXT-ALIGN: left">java_home没找到,重新设置,需要删掉原来的java_home,再新建,并且只能有一个目录</div>
<div style="TEXT-ALIGN: left">1.2 HelloWorld</div>
<div style="TEXT-ALIGN: left">在src下添加builds.xml配置</div>
<div style="TEXT-ALIGN: left">&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br/>&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "<a href="http://www.springframework.org/dtd/spring-beans.dtd">http://www.springframework.org/dtd/spring-beans.dtd</a>"&gt;</div>
<div style="TEXT-ALIGN: left">&lt;beans&gt;<br/>&lt;bean id="<strong>hello</strong>" class="example.chapter2.helloworld.HelloWorldImpl"&gt;<br/>&lt;property name="name" value="Spring" /&gt;<br/>&lt;/bean&gt;<br/>&lt;/beans&gt;<br/>根据xml的配置来管理和装配应用程序的所有bean组件</div>
<div style="TEXT-ALIGN: left">调用:</div>
<div style="TEXT-ALIGN: left">XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("beans.xml"));//初始化bean工厂<br/><br/>HelloWorld hello = (HelloWorld)factory.getBean("<strong>hello</strong>");//通过bean工厂获取bean实例<br/>System.out.println(hello.say());//调用bean实例实现应用程序所需的功能<br/>factory.destroySingletons();//注销spring的bean工厂</div>
</div>
<img src ="http://www.blogjava.net/tianya0801/aggbug/181870.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tianya0801/" target="_blank">未知数据</a> 2008-02-25 08:35 <a href="http://www.blogjava.net/tianya0801/archive/2008/02/25/181870.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>