2011-09-30 23 views
4

我讀過文檔,但沒有定義動態Bean的主要用途。我明白如何實現這一點,但不知道爲什麼這種方法如此好。ATG中Dynamic Bean的用途

那麼有人可以告訴這種情況何時使用Dynamic Bean?

謝謝

回答

2

動態bean通常允許您獲取和設置可能不是顯式成員的字段。最直接的比較是地圖 - 地圖允許您在事先未定義的情況下獲取和設置字段。然而,一個dyanamic bean符合標準的java成語(getter/setter)。然而,與hashmap不同的是,dyanbeans可以更容易地實施約束(並且它們隱藏了底層的數據結構實現,所以它們可以是懶惰的,或者在設置時進行數據連接等)。例如,你可以很容易地向你的dynabean添加一個明確的getter或setter,並且代碼可以很方便地閱讀並且乾淨地與其他bean apis進行交互。

public int getCost() 
{ 
    if(this.get("cost")==null) 
    return -1; 
    return Integer.parseInt(super.get("cost")); 
} 
+0

非常感謝。你能告訴我一個使用DynamicBeans的例子嗎? – Oleksandr

+0

是的......想象一下,你有一個從數據庫中獲取數據的數據庫。你想爲每一行創建一個對象 - 一個bean--帶有標準的getter和setter,這些標準的getter和setter可以被重寫。這裏使用一個動態bean – jayunit100

2

關於動態bean在ATG中最有用的部分是爲其尚未覆蓋的類提供額外的DynamicPropertyMapper類。首先,請注意,您可以使用DynamicBeans.setPropertyValue(object,property,value)和DynamicBeans.getPropertyValue(object,property)靜態方法來設置或獲取不必與Java bean屬性相對應的對象的屬性。如果你使用的對象沒有註冊到動態bean,它將默認嘗試使用Java bean屬性。支持提供開箱即用庫項目(屬性對應於存儲庫項目屬性;自然也適用於Profile對象),DynamoHttpServletRequest對象(對應於servlet參數),映射/字典(對應於鍵)以及DOM節點對象(對應於節點的getters/setter之後的元素屬性)。

要爲此添加更多類,您需要創建擴展DynamicPropertyMapper的類。例如,假設你想使HttpSession對象的工作方式類似,使用具有回退到HttpSession的getter和setter的屬性。然後,如果您沒有任何自定義BeanInfo或DynamicBeanInfo類用於實現此目標的對象,則可以使用DynamicPropertyMapper實現三個方法,並且可以使用DynamicBeans.getBeanInfo(object)輕鬆實現getBeanInfo(object)類。 。

一旦你有一個DynamicPropertyMapper,你可以註冊它與DynamicBeans.registerPropertyMapper(mapper)。通常情況下,這將被放入您正在編寫屬性映射器的類的靜態初始化塊中。但是,如果您爲另一個不受控制的類(如HttpSession)創建屬性映射器,則需要創建一個全局範圍的通用服務,該服務只需在其doStartService()中調用register方法即可。然後,您可以將該服務添加到您的初始服務。