【问题标题】:Java web application: Global application scope objectJava Web 应用程序:全局应用程序范围对象
【发布时间】:2014-03-27 14:12:41
【问题描述】:

我在 tomcat 5.5 服务器上部署了一个 Web 应用程序。我有一个单例类。我希望单例类的对象在应用程序的任何地方都可用。我正在使用 init 方法中的 servlet 初始化这个单例对象和其他进程,并配置 web.xml 设置load-on-startup。在 init 方法中,我创建了一个单例类的新对象,我希望这个对象在应用程序的任何地方都可用。怎么办?

【问题讨论】:

    标签: java tomcat web-applications


    【解决方案1】:

    获取ServletContext 并使用setAttribute() 来保存您的单身人士。然后,您可以在任何地方使用 getAttribute() 来获取它,因为每个 Web 应用程序只有一个 Servlet 上下文。

    您可以通过HttpServletRequest -> getSession() -> getServletContext() 获取大多数地方的上下文。

    【讨论】:

    • 啊。那么,不要使用Java。没有办法阻止坚定的头脑操纵对象(是的,有办法改变final字段......)
    • 我知道这是个愚蠢的问题,但这是要求。我正在做一个共同的项目。我不希望其他开发人员操纵公共对象
    • 你可以使用Spring或者Guice;这使得在创建单例后很难对其进行修改。请注意,任何诸如“任何人都不能有能力”的要求总是包含您必须支付的隐藏成本。所以你应该仔细考虑是否有人会意外替换单例。如果没有,那么您的预防措施可能只是浪费时间。
    • 如果您在init() 方法中调用它,那么这并不重要,因为没有其他线程可以访问它。如果您稍后对其进行操作,则需要进行同步。看到这个问题:stackoverflow.com/questions/616601/…
    • 在集群环境中,ServletContext 在每个节点上都进行了初始化,所以无论你放什么,它都不再是单例了。
    【解决方案2】:

    将您想要的值存储在static 字段中,然后创建static 方法来访问数据。

    【讨论】:

    • -1 全局变量在 20 年前很糟糕,现在仍然很糟糕 :-)
    • @AaronDigulla 你能提出比这更好的方法吗?问题陈述是。我想初始化一个单例对象并在我的应用程序中的任何位置访问该单例对象
    • @user3172529:你看到我的回答了吗?
    • 我认为这取决于存储的单例。例如,如果它是应用程序的名称,那就没问题了。这也使得它更容易在某些框架中访问,因为 ServletContext 并不那么容易获得。我的回答符合原题要求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-29
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多