spring中注入方式有多中,如構(gòu)造方法,SET/GET方法等.lookup方法注入有些與其它的不一樣,此方法注入常用來得到一個(gè)非單例對(duì)象.
lookup方法注入
利用了spring ioc容器重寫bean抽象(或)具體方法的能力,從而返回指定名字的bean實(shí)例.一般用來得到一個(gè)非單例對(duì)象.
如果方法不是抽象的,spring回簡單地覆蓋已有的實(shí)現(xiàn),在基于XML的配置文件中,通過在bean定義中使用lookup-method元素來告訴Spring所要足入/覆蓋的方法將要返回的實(shí)際bean
Random.java
package com.test;
public class Random {
private int i = (int) (100 * Math.random());
public void printRandom() {
System.out.println("輸出隨機(jī)整數(shù): " + i);
}
}
------------------------------------------------
HelloRandom.java
package com.test;
public interface HelloRandom {
public Random getRandom();
public Random createRandom();
}
-------------------------------------------------
HelloRandomAbstract.java
package com.test;
public abstract class HelloRandomAbstract implements HelloRandom{
private Random random;
public Random getRandom() {
return random;
}
public void setRandom(Random random) {
this.random = random;
}
//此方法建議是抽象的
public abstract Random createRandom();
}
---------------------------
XML文件如下:
<bean id="random" class="com.test.Random" singleton="false"/>
<bean id="helloRandomAbstract" class="com.test.HelloRandomAbstract">
<lookup-method name="createRandom" bean="random"/>
<property name="random">
<ref local="random"/>
</property>
</bean>
helloRandomAbstract對(duì)象有2中方式可以得到Random對(duì)象:通過getRandom() 方法,通過createRandom()方法;
兩者有什么不同呢,前一中方法得到的同一個(gè)對(duì)象,也就是說只要getRandom(),得到的都是同一個(gè)方法;后一種方法調(diào)用一次createRandom(),每次調(diào)用得到的都是性的Random對(duì)象.這就象前面說的spring ioc容器重寫bean抽象(或)具體方法的能力,從而返回指定名字的bean實(shí)例.一般用來得到一個(gè)非單例對(duì)象.
另外還有一種方法可以實(shí)現(xiàn)類似功能:
<bean id="random" class="com.test.Random" scope="
prototype"/>,因?yàn)?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范圍的bean,在沒一次請(qǐng)求都會(huì)生成一個(gè)新的對(duì)象,就象是用new Random()一樣;不足是,此屬性只有在早期版本的spring不支持!