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

时间:2010-06-04 18:48:15

标签: java java-ee

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

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

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

if (insideServletContainer(this.getClass().getClassLoader()) { 
  /// do some servlet specific config
}
else {
 /// do some standalone config
}

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

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

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

尼克

4 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:7)

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

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

答案 2 :(得分:4)

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

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

在webapp版本中,这将由在web.xml内配置的侦听器或过滤器完成。

Dependency injection在这里非常有用,因为它不需要您的应用程序检查这些类型的东西;相反,应用程序被赋予了它所需要的东西。

答案 3 :(得分:0)

我会推荐像@matt b这样的依赖注入。

作为第二种选择,如果只是您描述的简单案例,并且您不想添加或学习DI框架来支持此功能。通过使用属性文件根据环境加载不同的值,您可以完成与当前代码相同的操作。您可以简单地为每个环境使用不同的文件,并提供VM arg以指示您正在运行的环境。

db_prop.dev
db_prop.stalone
dp_prop.int
db_prop.prod

然后您可以按资源加载

"db_prop." + System.getProperty("runtime.env")