spring中的lookup

有些問題是你必須面對的 —魯迅

爲什麼會想認識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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章