Jakarta ee 了解cdi实例<&燃气轮机;and.get()vs@Inject
我有点困惑在以下情况下使用哪种方法: 假设servlet创建了一个处理用户http会话的应用程序,该应用程序如下所示:Jakarta ee 了解cdi实例<&燃气轮机;and.get()vs@Inject,jakarta-ee,java-ee-6,cdi,jboss-weld,Jakarta Ee,Java Ee 6,Cdi,Jboss Weld,我有点困惑在以下情况下使用哪种方法: 假设servlet创建了一个处理用户http会话的应用程序,该应用程序如下所示: public class Application extends AbstractHTTPApplication { @Inject private Instance<MainView> mainView; public void setupApplication() { this.setView( mainView.get() ); } 现在,当我尝试
public class Application extends AbstractHTTPApplication {
@Inject
private Instance<MainView> mainView;
public void setupApplication() {
this.setView( mainView.get() );
}
现在,当我尝试一个常规的@injectssb-SSB
作为MainView
中的一个字段,我没有为每个用户获得新的SSB
:
public class MainView {
@Inject
private SSB usersSSB;
public someMethod() {
usersSSB.doSomething();
System.identityHashCode( usersSSB );
}
}
通过对两个用户进行测试,我在两个用户会话中得到了相同的usersSSB
实例。我不认为这是可能的。。。我想,既然SSB是会话范围,那么每个用户会话都会有一个新的会话,无论它在哪里@Inject
ed,它都会引用该用户的SSB
相反,我尝试:
public class MainView {
@Inject
private Instance<SSB> usersSSB;
public someMethod() {
usersSSB.get().doSomething();
System.identityHashCode( usersSSB.get() );
}
}
而ApplicationWrapper
是一个SessionScoped
bean:
@SuppressWarnings("serial")
@SessionScoped
public class ApplicationWrapper implements Serializable {
@Inject
private AbstractCdiApplication application;
public AbstractCdiApplication getApplication() {
return application;
}
}
这难道不意味着调用MainView中的任何位置(或该用户会话中的任何对象)的@injectssb usersSSB
应该为每个用户的会话提供该用户的会话范围bean,并且始终是相同的会话范围bean吗?意思是——不同的用户对应不同的ssb,因为每个用户有不同的会话
毕竟,应用程序
本身是一个SessionScoped
bean,通过servlet的getNewApplication
方法注入并附加到用户的HTTP会话中?我的意思是,注入和附加MainView类的毕竟是应用程序对象,对吗?这意味着MainView是一个会话范围的bean,不是吗
我只是想弄明白这一切是怎么回事。谢谢你的帮助 之所以发生这种情况,是因为“@Inject Instance”是动态获取的,与“@Inject”不同 如果您在ApplicationScoped bean中执行“@Inject”,那么只会获得一次注入,因此在ApplicationScoped bean中,所有用户都将使用相同的引用 如果在“@Inject Instance”上调用.get(),则每次调用.get()时都会动态获取对SSB的引用
关于注射的更多信息,您可以在这里阅读:这很奇怪。你有这个样本可以测试吗?老实说,我没有足够的把握来做一个简单的测试用例。。。是否有一个可以工作的maven原型可以让您从一个http servlet开始,为每个新会话创建一个应用程序?我可以用它来构建一个测试项目并发布它。我已经添加了一些更多的信息,这些信息是由你的评论引起的,Krzusztof。
@Inject
是否应该始终将同一对象赋予该用户?既然不同的用户处于不同的会话中,那么该@Inject
是否应该为不同的用户提供不同的对象?您实际得到的是一个代理,它将每次查找正确的资源。
public abstract class AbstractCdiApplicationServlet extends
AbstractApplicationServlet {
@Inject
protected Instance<ApplicationWrapper> wrapper;
@Override
protected Application getNewApplication(HttpServletRequest request)
throws ServletException {
return wrapper.get().getApplication();
}
...etc etc
@SuppressWarnings("serial")
@SessionScoped
public class ApplicationWrapper implements Serializable {
@Inject
private AbstractCdiApplication application;
public AbstractCdiApplication getApplication() {
return application;
}
}