在我的main()方法中,我使用Spring創建了一個PersonCollection對象,然後我開始加載不同的Persons對象。超越基本教程的Spring依賴注入
BeanFactory appContext = new ClassPathXmlApplicationContext("cp-beans.xml");
PersonCollection pc = appContext.getBean(PersonCollection.class);
Person aPerson = pc.loadById(1);
aPerson.doSomething();
aPerson.loadById(1067);
aPerson.doSomething();
反過來PersonCollection.loadById()可從分佈式緩存或從Amazon SimpleDB的加載對象:
public Person loadById(int id) throws ConnectException, NoSuchElementException {
String memCacheKey = "Person-" + id;
Person aPerson = (Person) cache.get(memCacheKey);
if (aPerson != null) {
return aPerson; //cache hit
}
aPerson = loadByIdFromSdb(id); //cache miss, read it from SimpleDB
cache.set(memCacheKey, aPerson);
return aPerson;
}
因此,有兩種方法創建一個人,所述第一從分佈式緩存反序列化,在第二個將調用新的Person()並分配所有數據。
人有兩個@Autowired屬性並聲明爲@Service,並且該包位於上下文中:component-scan,但是依賴關係未傳遞,因爲該bean是使用new或從緩存中創建的,而不是與Spring框架。
我可以使用appContext.getBean()來創建Person對象,但是,這意味着要傳遞applicationContext並在應用程序內部使用getBean(),這不正確。
如何解決問題?
更新:我閱讀文檔,並試圖瑞恩·斯圖爾特的建議,並寫了一個小例子項目躍躍欲試。它很好用,謝謝!
https://github.com/stivlo/spring-di
最終,我已經重構我原來的計劃,因爲我並不需要這個功能了一種方法,但就是在我的阿森納的好工具。
謝謝你,選項二看起來很有希望:看着它。 – stivlo
+1從來沒有偶然發現選項二,這聽起來非常有希望。 – Daniel
今天我有一個用例,它受益於@Configurable編織。我遵循我自己的源代碼示例,但儘管有很多測試和挫敗感,但直到我添加了時,它才工作 - 這很奇怪,因爲我不喜歡在我的測試項目中沒有這個標籤,它無論如何都可以工作。 –
stivlo