﻿<?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/hulizhong/category/33680.html</link><description>----Java's Slave----&lt;br&gt;
***Java's Host***</description><language>zh-cn</language><lastBuildDate>Mon, 11 Aug 2008 13:03:47 GMT</lastBuildDate><pubDate>Mon, 11 Aug 2008 13:03:47 GMT</pubDate><ttl>60</ttl><item><title>lookup方法注入</title><link>http://www.blogjava.net/hulizhong/archive/2008/08/11/221326.html</link><dc:creator>二胡</dc:creator><author>二胡</author><pubDate>Mon, 11 Aug 2008 08:31:00 GMT</pubDate><guid>http://www.blogjava.net/hulizhong/archive/2008/08/11/221326.html</guid><wfw:comment>http://www.blogjava.net/hulizhong/comments/221326.html</wfw:comment><comments>http://www.blogjava.net/hulizhong/archive/2008/08/11/221326.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hulizhong/comments/commentRss/221326.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hulizhong/services/trackbacks/221326.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; spring中注入方式有多中,如构造方法,SET/GET方法等.lookup方法注入有些与其它的不一样,此方法注入常用来得到一个非单例对象.<br />
lookup方法注入<span style="color: red">利用了spring ioc容器重写bean抽象(或)具体方法的能力,从而返回指定名字的bean实例.<span style="color: #000000">一般用来得到一个非单例对象.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果方法不是抽象的,spring回简单地覆盖已有的实现,在基于XML的配置文件中,通过在bean定义中使用lookup-method元素来告诉Spring所要足入/覆盖的方法将要返回的实际bean<br />
<hr />
<br />
Random.java<br />
<p>package com.test;</p>
<p>public class Random {<br />
&nbsp;private int i = (int) (100 * Math.random());</p>
<p>&nbsp;public void printRandom() {<br />
&nbsp;&nbsp;System.out.println("输出随机整数:&nbsp; " + i);<br />
&nbsp;}</p>
<p>}<br />
------------------------------------------------<br />
HelloRandom.java<br />
</p>
<p>package com.test;</p>
<p>public interface HelloRandom {<br />
&nbsp;public Random getRandom();<br />
&nbsp;&nbsp;&nbsp; public Random createRandom();</p>
<p>}<br />
</p>
<p>-------------------------------------------------<br />
HelloRandomAbstract.java<br />
</p>
<p>package com.test;</p>
<p>public abstract class HelloRandomAbstract implements HelloRandom{<br />
&nbsp;private Random random;</p>
<p>&nbsp;public Random getRandom() {<br />
&nbsp;&nbsp;return random;<br />
&nbsp;}</p>
<p>&nbsp;public void setRandom(Random random) {<br />
&nbsp;&nbsp;this.random = random;<br />
&nbsp;}<br />
&nbsp;&nbsp;&nbsp; //此方法建议是抽象的<br />
&nbsp;public abstract Random createRandom();</p>
<p>}<br />
</p>
<p>---------------------------<br />
XML文件如下:<br />
&lt;bean id="random" class="com.test.Random" singleton="false"/&gt;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;bean id="helloRandomAbstract" class="com.test.HelloRandomAbstract"&gt;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;lookup-method name="createRandom" bean="random"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="random"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref local="random"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/bean&gt;<br />
</p>
helloRandomAbstract对象有2中方式可以得到Random对象:通过getRandom() 方法,通过createRandom()方法;<br />
两者有什么不同呢,前一中方法得到的同一个对象,也就是说只要getRandom(),得到的都是同一个方法;后一种方法调用一次createRandom(),每次调用得到的都是性的Random对象.这就象前面说的<span style="color: #ff0000">spring ioc容器重写bean抽象(或)具体方法的能力,从而返回指定名字的bean实例.一般用来得到一个非单例对</span><span style="color: #000000">象.</span></span></span> <br />
另外还有一种方法可以实现类似功能：<br />
&lt;bean id="random" class="com.test.Random" scope="<span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">prototype</span>"/&gt;,因为<span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">prototype</span>范围的bean，在没一次请求都会生成一个新的对象，就象是用new Random()一样；不足是，此属性只有在早期版本的spring不支持！<img src ="http://www.blogjava.net/hulizhong/aggbug/221326.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hulizhong/" target="_blank">二胡</a> 2008-08-11 16:31 <a href="http://www.blogjava.net/hulizhong/archive/2008/08/11/221326.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>