代码之家  ›  专栏  ›  技术社区  ›  Nick Hristov

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

  •  4
  • Nick Hristov  · 技术社区  · 16 年前

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

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

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

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

    当然,问题是,我能否编写一个可靠的方法来判断类是否加载在servlet容器中。最多感觉像个黑客。

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

    所以,总结一下我的问题是 : 如果类是从servlet容器中加载的,您知道一个好的/可靠的机制吗? 如果没有,我就要走第二条路。

    尼克

    4 回复  |  直到 16 年前
        1
  •  7
  •   Zak    16 年前

    这似乎是个很坏的主意。相反,为什么不允许类获取参数,然后让容器或应用程序对其进行适当的配置?

        2
  •  7
  •   Brett Kail    16 年前

    抛开这是否是个好主意,我建议查找Java:COMP/EnV,它只在EE服务器上可用:

    try {
      new InitialContext().lookup("java:comp/env");
      /// do some servlet specific config
    } catch (NamingException ex) {
      /// do some standalone config
    }
    
        3
  •  4
  •   matt b    16 年前

    做这类事情的另一种方法是配置 注入的 通过某种引导加载程序进入这个类。

    在独立版本中,这将由 main() 方法(或从中调用的内容)。

    在webapp版本中,这将由在 web.xml .

    Dependency injection 在这里很有用,因为它消除了应用程序检查这些东西的需要;相反,应用程序得到了它需要的东西。

        4
  •  0
  •   Robin    16 年前

    我建议像@matt b这样的依赖注入。

    作为第二个选项,如果它只是您描述的简单情况,并且您不想添加或学习一个DI框架来支持这个特性。通过使用属性文件根据环境加载不同的值,可以完成与当前代码相同的任务。您只需为每个环境使用一个不同的文件,并提供一个vm参数来指示正在运行的环境。

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

    然后可以按资源加载

    "db_prop." + System.getProperty("runtime.env")
    
    推荐文章