【问题标题】:Where to instantiate the class在哪里实例化类
【发布时间】:2012-05-04 11:40:27
【问题描述】:

我有一个普通的 .java 类。在该课程中,我使用Timer 课程安排方法来安排任务。

问题是我正在使用 Java EE 应用程序,但我不知道在哪里实例化这个类;来自 Servlet 或类似的东西?当我的应用程序启动时,我只想实例化该类一次。

【问题讨论】:

标签: java jakarta-ee


【解决方案1】:
 public class YourServlet extends HttpServlet {
 private YourClass instance;

 public void init() throws ServletException {
      instance = new YourClass();
 }
 //code
 }

通过在 init 方法中实例化您的类,您将确保您的类只会被实例化一次,因为在 Java EE 应用程序中,Servlet 只会加载到服务器内存中一次。

【讨论】:

  • 不管我调用这个 servlet 多少次,但是对象只会被创建一次,对吧?除非直到我关闭应用程序?
  • 对,对象只会被创建一次,直到应用重启。
  • +1,这是另一种选择,即每个 servlet,而不是每个应用程序,就像我的回答一样。也可行,具体取决于用例
【解决方案2】:

在 Quartz(一种流行的调度程序)中,一种常见的做法是在 Servlet 的 init 方法中配置作业,并将 load-on-startup 属性设置为 true:

来自this article,在 web.xml 你应该这样做:

<servlet>
    <servlet-name>QuartzInitializer</servlet-name>
    <display-name>Quartz Initializer Servlet</display-name>
    <servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

然后在您的 servlet 中配置作业:

public class QuartzServlet extends GenericServlet {
    public void init(ServletConfig config) throws ServletException {
    super.init(config);
    // And continue with your configuration

PS:我强烈推荐你使用 Quartz

【讨论】:

    【解决方案3】:

    您可能需要ServletContextListener 及其方法contextInitialized(..)。它在您的应用程序初始化时被调用一次。

    您在 web.xml 中使用 @WebListener&lt;listener&gt;&lt;listener-class&gt;..&lt;/...&gt; 映射侦听器

    【讨论】:

    • 我完全不知道。请你举例说明一下。
    • 我添加了一个链接和一个段落。你只需实现接口,在方法中做你需要做的事情,并以建议的任何一种方式映射类
    • 好的,但我有一个问题。现在这个接口将由一个servlet实现,我明白了。但是如果我再次调用servlet,当应用程序启动时,它会工作吗?
    • 这个接口由任何类实现,最好不是servlet。它只会被调用一次,不管你在哪里实现它。
    • 查看此answer by BalusC 示例代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-30
    • 1970-01-01
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    相关资源
    最近更新 更多