Java 在Bean中只实例化一次值

Java 在Bean中只实例化一次值,java,jakarta-ee,Java,Jakarta Ee,我不熟悉使用servlet,所以如果我使用了不正确的术语,请原谅我。我在JSFbean类“Detector”中有一个名为“Provider”的对象,它需要实例化一次,然后才能用于所有其他请求。我已经做了一些搜索,并找到了界面,似乎做了我需要的。我在我的web.xml文件中提到过: <listener> <listener-class> p1.ContextListener </listener-class> </liste

我不熟悉使用servlet,所以如果我使用了不正确的术语,请原谅我。我在JSFbean类“Detector”中有一个名为“Provider”的对象,它需要实例化一次,然后才能用于所有其他请求。我已经做了一些搜索,并找到了界面,似乎做了我需要的。我在我的web.xml文件中提到过:

<listener>
    <listener-class>
        p1.ContextListener
    </listener-class>
</listener>
这是我的探测器课程:

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来说,这似乎是个坏主意。我的问题是将提供者对象作为静态对象是否正确

使用“静态”是个坏主意。如果希望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实例我找到了这个问题的答案。我在“ContextListener”中将Provider对象设置为ServletContextEvent的属性,并在检测器类中从FacesContext对象“context”检索它。(这在提供的链接的公认答案中有更详细的说明)

您的问题令人困惑。您没有使用servlet。您正在使用JSF支持bean。至于具体问题,只要具体功能需求不明确,就无法回答。我们不知道
检测器
提供者
创建者
应该做什么。但是,在企业多线程应用程序中,通常不赞成以这种方式使用
static
。您应该“只创建一个”,请注意OP实际上并没有使用servlet。
public class MyServlet extends HttpServlet {
    private MyProdiver provider;

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