![](/img/trans.png)
[英]Detect J2EE container stop event while a servlet's doGet() is still running
[英]Detect if running in servlet container or standalone
我有一個簡單的問題:我想根據對象是否在servlet容器中實例化,或者是否在獨立應用程序中實例化來不同地配置對象。
該對象是數據庫連接,我關心設置查詢超時。
我能想出的第一個解決方案是:
if (insideServletContainer(this.getClass().getClassLoader()) {
/// do some servlet specific config
}
else {
/// do some standalone config
}
當然,問題是我是否可以編寫一個可靠的方法來判斷該類是否已在servlet容器中加載。 它充其量只是一種黑客行為。
第二種選擇是假設默認情況是獨立實例化,基於獨立配置設置默認值,並在servlet上下文中覆蓋它們。
所以,總結一下我的問題是 : 如果從servlet容器中加載了類,你知道一個好的/可靠的機制嗎? 如果沒有,我將采取第二條路線。
缺口
這似乎是一個非常糟糕的主意。 相反,為什么不允許類接受參數,然后讓容器或應用程序適當地配置它?
不管這是不是一個好主意,我建議查找java:comp / env,它只能在EE服務器中使用:
try {
new InitialContext().lookup("java:comp/env");
/// do some servlet specific config
} catch (NamingException ex) {
/// do some standalone config
}
執行此類操作的另一種方法是通過某種引導加載程序將配置注入此類。
在獨立版本中,這可以通過main()
方法(或從它調用的東西)來完成。
在webapp版本中,這可以通過在web.xml
配置的偵聽器或過濾器來完成。
依賴注入在這里很有用,因為它不需要你的應用程序檢查這些東西; 相反,應用程序被給予它所需要的東西。
我會推薦像@matt b這樣的依賴注入。
作為第二種選擇,如果只是您描述的簡單案例,並且您不想添加或學習DI框架來支持此功能。 通過使用屬性文件根據環境加載不同的值,您可以完成與當前代碼相同的操作。 您可以簡單地為每個環境使用不同的文件,並提供VM arg以指示您正在運行的環境。
db_prop.dev
db_prop.stalone
dp_prop.int
db_prop.prod
然后你可以按資源加載
"db_prop." + System.getProperty("runtime.env")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.