我在网上找不到任何相关内容或任何引用。问题就在这里
我有一个非常简单的网络项目
- index.xhtml
<pre>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
<title>Index</title>
</h:head>
<h:body>
<h:form>
<h:panelGrid>
<h:outputText value="#{myBean.message}" />
<h:inputText value="#{myBean.name}" />
<h:commandButton action="#{myBean.sayHello()}"
value="Say Hello">
<f:ajax execute="@form" render="@form" />
</h:commandButton>
</h:panelGrid>
</h:form>
</h:body>
</html>
</pre>
- MyBean.java
<pre>
import javax.enterprise.inject.Model;
import javax.inject.Inject;
@Model
public class MyBean
{
@Inject
private MyEJB myEjb;
public MyBean()
{
System.out.println("Creating MyBean");
}
private String name;
private String message;
public void sayHello()
{
setMessage(myEjb.sayHello(getName()));
}
public String getMessage()
{
return message;
}
public void setMessage(String message)
{
this.message = message;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
}
</pre>
- MyEJB.java
<pre>
import javax.ejb.Stateless;
@Stateless
public class MyEJB
{
public MyEJB()
{
System.out.println("Creating MyEJB");
}
public String sayHello(String name)
{
return "Hello " + name;
}
}
</pre>
这工作正常,但 glassfish 日志显示了这一点
信息:创建 MyBean 信息:创建 MyBean 信息:创建 MyEJB 信息:创建 MyBean 信息:创建 MyEJB 信息:创建 MyEJB
根据单个请求。
这意味着 MyBean 根据请求创建了 3 次,MyEJB 则创建了 3 次
我想知道这是正常行为还是 glassfish 上的错误,或者我可能在这里做了一些真正错误的事情,因为如果在每个请求上创建和销毁这么多对象,那么严肃的应用程序将会出现问题。
如果我改用这样更经典的方法
<pre>
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
@RequestScoped
@ManagedBean
public class MyBean
{
@EJB
private MyEJB myEjb;
public MyBean()
{
System.out.println("Creating MyBean");
}
private String name;
private String message;
public void sayHello()
{
setMessage(myEjb.sayHello(getName()));
}
public String getMessage()
{
return message;
}
public void setMessage(String message)
{
this.message = message;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
}
</pre>
输出不同
我创建了 1 个 ejb,然后请求的其余部分由该实例处理 MyBean 为每个请求创建一次。
请帮助我,也许我错过了 cdi 规范。
谢谢
最佳答案
调试 EJB/CDI/JSF/... 组件的构造函数是一个错误的 friend 。
在现代框架中,有很多事情在幕后进行 - 其中相当多的事情使用 Java 反射 - 并且您不能依赖对构造函数的调用来表明您拥有一个新鲜且随时可用的组件。
您需要做的是使用适当的生命周期 Hook 之一。这些被明确设计为在创建/销毁/去钝化/钝化组件之后/之前调用。
在您的情况下,请使用@PostConstruct
,documentation here .
关于java - 每个请求都会创建注入(inject) @Model bean 的 EJB (GlassFish),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10942592/