我已经看到SO中有几个类似的问题,但没有一个真正帮助过我。
直截了当,我正在Eclipse中工作,我在Wildfly8上部署了一个具有这种结构的EAR:
ZeroCDI ,一个带有此类的java独立项目
@SessionScoped
public class MyUser implements Serializable{
private static final long serialVersionUID = -8247101999419229162L;
private String name;
public void setAndPrintName(String name) {
System.out.println("Object = "+this);
System.out.println("Old name = "+this.name);
this.name = name;
System.out.println("New name = "+this.name);
}
}
ZeroWEB :耳朵的网络模块,其中 ZeroCDI 已添加到部署程序集部分中。它有这个唯一的servlet
@WebServlet("/ZeroServlet")
public class ZeroServlet extends HttpServlet {
...
@Inject MyUser user;
@EJB UserService userService;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
user.setAndPrintName("foo");
userService.setCurrentUser("bar");
}
...
}
ZeroEJB :ear的EJB模块,其中 ZeroCDI 添加到Deployment Assembly部分。它只有这个EJB
@Stateless
@LocalBean
public class UserService {
public UserService() {}
@Inject MyUser user;
public void setCurrentUser(String username){
user.setAndPrintName(username);
}
}
ZeroEAR :包含两个模块(WEB和EJB)和库 ZeroCDI.jar
运行应用程序我可以看到servlet和ejb没有引用同一个对象:
16:19:50,674 INFO [stdout] (default task-2) Object = nets.devsedge.beans.MyUser@596ab996
16:19:50,674 INFO [stdout] (default task-2) Old name = null
16:19:50,674 INFO [stdout] (default task-2) New name = foo
16:19:50,701 INFO [stdout] (default task-2) Object = nets.devsedge.beans.MyUser@579a2f59
16:19:50,702 INFO [stdout] (default task-2) Old name = null
16:19:50,702 INFO [stdout] (default task-2) New name = bar
为什么会这样?不应该通过整个应用程序在同一会话中共享我的会话范围bean实例吗?为什么在EJB中注入新实例呢?