我在网上找不到灵魂或任何参考。这是问题所在
我有一个非常简单的网络项目
- 索引.xhtml
<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>
- MyBean.java
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;
}
}
- MyEJB.java
import javax.ejb.Stateless;
@Stateless
public class MyEJB
{
public MyEJB()
{
System.out.println("Creating MyEJB");
}
public String sayHello(String name)
{
return "Hello " + name;
}
}
这工作正常,但 glassfish 日志显示了这一点
信息:创建 MyBean 信息:创建 MyBean 信息:创建 MyEJB 信息:创建 MyBean 信息:创建 MyEJB 信息:创建 MyEJB
在一个请求上。
这意味着 MyBean 在请求中被创建了 3 次,而 MyEJB 被创建了 3 次以上
如果这是正常行为,或者是 glassfish 上的错误,或者我在这里做错了什么,我会徘徊,因为如果在每个请求上创建和销毁这么多对象,seriuos 应用程序就会出现问题。
如果我换成这样更经典的 aproche
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;
}
}
输出不一样
我创建了 1 个 ejb,然后请求的其余部分由该实例处理,并且 MyBean 为每个请求创建一次。
请帮助我,也许我错过了 cdi 规范。
谢谢