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