检测是否在servlet容器中运行或独立运行

Nic*_*tov 4 java java-ee

我有一个简单的问题:我想根据对象是否在servlet容器中实例化,或者是否在独立应用程序中实例化来不同地配置对象.

该对象是数据库连接,我关心设置查询超时.

我能想出的第一个解决方案是:

if (insideServletContainer(this.getClass().getClassLoader()) { 
  /// do some servlet specific config
}
else {
 /// do some standalone config
}
Run Code Online (Sandbox Code Playgroud)

当然,问题是我是否可以编写一个可靠的方法来判断该类是否已在servlet容器中加载.它充其量只是一种黑客行为.

第二种选择是假设默认情况是独立实例化,基于独立配置设置默认值,并在servlet上下文中覆盖它们.

所以,总结一下我的问题是:如果从servlet容器中加载了类,你知道一个好的/可靠的机制吗?如果没有,我将采取第二条路线.

缺口

Zak*_*Zak 7

这似乎是一个非常糟糕的主意.相反,为什么不允许类接受参数,然后让容器或应用程序适当地配置它?


Bre*_*ail 7

不管这是不是一个好主意,我建议查找java:comp/env,它只能在EE服务器中使用:

try {
  new InitialContext().lookup("java:comp/env");
  /// do some servlet specific config
} catch (NamingException ex) {
  /// do some standalone config
}
Run Code Online (Sandbox Code Playgroud)


mat*_*t b 5

执行此类操作的另一种方法是通过某种引导加载程序将配置注入此类。

main()在独立版本中,这将通过方法(或从中调用的东西)来完成。

在 web 应用程序版本中,这将通过调用在web.xml.

依赖注入在这里很有用,因为它消除了应用程序检查这些事情的需要;相反,应用程序会得到它需要的东西。