有些問題是你必須面對的 —魯迅
爲什麼會想認識Lookup
在看spring源碼的時候總是會碰到這個lookup,我沒有用過這個東西,想跳過它,但是它不斷的出現,難道是緣分?我決定正式認識認識她
Lookup的使用場景
我們在一個單例對象中,想引入一個原型對象,直接用@Autowired是不行的,這個時候,Lookup就有用武之地了
測試如下
@Component
@Scope("prototype")
public class PrototypeObject {
}
@Component
public class SingletonObject {
@Autowired
PrototypeObject prototypeObject;
public void saySingletonHashCode() {
System.out.println("我的hash值是" + prototypeObject.hashCode());
}
}
public class Start {
public static void main(String[] args) {
// 以AnnotationConfigApplicationContext加載容器
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(BaseConfig.class);
SingletonObject singletonObject = (SingletonObject)applicationContext.getBean("singletonObject");
for(int i = 0; i < 3; i++) {
singletonObject.saySingletonHashCode();
}
}
}
結果如下
我的hash值是1909546776
我的hash值是1909546776
我的hash值是1909546776
如上結果可見,我們通過@Autowired引入的始終以同一個對象
現在該@Lookup上場了
需要調整下單例的實現
@Component
public class SingletonObject {
//此處方法是否抽象,實現如何,主都不在意,反正都會被重寫
@Lookup
public PrototypeObject getPrototypeObject() {return null;};
public void saySingletonHashCode() {
System.out.println("我的hash值是" + getPrototypeObject().hashCode());
}
}
結果如下
我的hash值是1738236591
我的hash值是1558021762
我的hash值是225290371
可以看到,我們得到了我們想要的結果,每次調用時,返回的都是一個新的對象
Note
對於加了@Lookup的方法,格式要求如下
<public|protected> [abstract] <return-type> theMethodName(no-arguments);