2011-10-17 77 views
1

我創建了一個實現ServletContextAttributeListener沒有默認構造函數的類和容器抱怨:爲什麼ServletContextAttributeListener需要默認構造函數?

嚴重:錯誤配置..... java.lang.InstantiationException的應用聽衆:......

所以我創建了一個默認構造函數,除了參數化構造函數,並且一切正常。由於容器需要一個默認構造,我懷疑容器正在創建一個新的類實例,而不是使用已經創建的實例。但插入靜態對象計數器成員數據,我發現這種懷疑是真實的。

我的問題是:如果我想更新我的對象的成員數據ServletContextAttributeEvent,我可以以線程安全的方式嗎?容器創建一個新對象有什麼副作用,以及有哪些解決方法?

+0

不應該屬性有非默認構造函數嗎?通過setter方法設置屬性成員數據是否是最佳實踐? –

回答

2

是的,容器instanciates它爲你。是的,這個對象對於整個webapp(在JVM中)是唯一的,你必須確保一切都是以線程安全的方式完成的,使用同步。我沒有看到任何副作用或解決方法。這就是它應該如此。

您似乎混淆了屬性和偵聽器。您可以設置和刪除任何類型的屬性到servlet上下文中。這些屬性應該是而不是實現ServletContextAttributeListener

另一方面,您也可以通過web.xml註冊偵聽器,或通過調用ServletContextaddListener方法之一來註冊偵聽器。那些聽衆是而不是 servlet上下文屬性。

如果您已將一個ServletContextAttributeListener註冊到servlet上下文中,那麼每次在servlet上下文中設置或刪除任何屬性時,都會調用該偵聽器的適當方法。已設置或刪除的屬性的名稱和值將位於偵聽器接收的事件中。因此,由於容器並行處理多個請求,並且由於每個請求都可以從servlet上下文中設置或刪除屬性,所以偵聽器將被並行調用多次,因此必須是線程安全的。

+0

您可以舉一個典型的電子商務應用程序中的應用程序範圍內的唯一對象的簡單示例嗎? 我在想 - 主要目標是在不同組件之間共享_attribute_對象 - 次要目標是對_ServletContextAttributEvent_執行特定操作。 當我已經創建了一個我想與其他組件共享的_attribute_對象時,爲什麼容器應該創建另一個? –

+0

@Ravisankar:對不起,但我不明白你在問什麼。 ServletContextListener是一個對象,當在servlet上下文中添加,刪除或替換屬性時,容器將調用該對象。每次調用ServletContext.set/removeAttribute()時,都會調用監聽器。您可以自己創建它並將它自己添加到servlet上下文中,或者在web.xml中聲明它,讓容器實例化它併爲它添加它。在後一種情況下,你需要一個默認的構造函數。 –

+0

續:但在這兩種情況下,實例(由您或容器創建)都將接收所有事件,並且必須以線程安全的方式處理它們。 –

相關問題