Jakarta ee 了解cdi实例<&燃气轮机;and.get()vs@Inject

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() ); } 现在,当我尝试

我有点困惑在以下情况下使用哪种方法:

假设servlet创建了一个处理用户http会话的应用程序,该应用程序如下所示:

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;
}
 }