java - 在 Bean 中仅实例化一次值

标签 java jakarta-ee

我是使用 Servlet 的新手,所以如果我使用了不正确的术语,请原谅我。我在 JSF Bean 类“Detector”中有一个名为“Provider”的对象,需要实例化一次,然后可用于所有其他请求。我做了一些搜索并找到了 ServletContextListener界面似乎可以满足我的需要。我在我的 web.xml 文件中提到过它,如下所示:

<listener>
    <listener-class>
        p1.ContextListener
    </listener-class>
</listener>

该类如下所示:

package p1;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

public class ContextListener implements ServletContextListener{

   @Override
   public void contextInitialized(ServletContextEvent sce) {
      Detector.startProvider();
   }

   @Override
   public void contextDestroyed(ServletContextEvent sce) {
     Provider.dispose();
   }  
}

这是我的探测器类:

package p1;

import javax.faces.bean.ManagedBean;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;


@ManagedBean
public class Detector{

    private static Provider p;
    FacesContext context;
    String userAgent;

    public Detector() {
        context = FacesContext.getCurrentInstance();
    }

    public String getValue() {
        return p.getValue();
    }

    public String getUserAgent() {
        return ((HttpServletRequest) context.getExternalContext().getRequest()).getHeader("User-Agent");
    }

    public static void startProvider(){
        p = Creater.create();
    }
}

我的代码一切正常,但对我来说唯一正确的方法是将 Provider 对象作为静态对象,但这对于将用于不同请求的 Bean 来说似乎是一个坏主意。我的问题是,将 Provider 对象设置为静态是否正确?

最佳答案

使用“静态”是一个坏主意。如果您希望 servlet 中的某个对象在该 servlet 处理的所有 HTTP 请求之间共享,那么只需将其设为 servlet 类的一个字段即可。初始化该字段变量的最佳位置是 init() 方法。

public class MyServlet extends HttpServlet {
    private MyProdiver provider;

    public void init() throws ServletException {
        this.provider = new MyProdiver();
        // do init
    }
}

除非您的 Servlet 类实现 SingleThreadModel,否则部署描述符 (web.xml) 中的每个 Servlet 声明只有一个 Servlet 实例

关于java - 在 Bean 中仅实例化一次值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12283493/

相关文章:

java - JVM 会自动关闭文件吗?

java - 交付启动 MySQL 的 java 应用程序(独立应用程序)

java - 如何在集群中维护 session 或变量状态或对象状态(特别是基于 Java 的应用程序服务器)?

java - struts2中如何使用表单提交复合对象

java - 在 Android Studio 中将数据从 onReceive 传输到 SQL 数据库

Java 多态性 : Accessing methods in super and subclasses

java - eclipse + Maven : force Execution Environment "JavaSE-1.6" instead of fixed JDK

java - 如何在 Java 中的 JTextArea 类中添加滚动条?

eclipse构建我的Java EE应用程序时的Javascript缩小?

java - 来自单个 println 的多个日志语句