gpt4 book ai didi

jakarta-ee - 了解 cdi Instance<> 和 .get() 与 @Inject

转载 作者:行者123 更新时间:2023-12-03 17:08:02 24 4
gpt4 key购买 nike

我对在以下情况下使用哪个感到有点困惑:

假设 servlet 创建了一个应用程序来处理用户的 http session ,应用程序是这样的:

public class Application extends AbstractHTTPApplication {

@Inject
private Instance<MainView> mainView;

public void setupApplication() {
this.setView( mainView.get() );
}

后来我有一个 @SessionScoped bean 类 SSB我想注入(inject)每个用户的bean:
@SessionScoped
public class SSB {}

现在,当我尝试常规 @Inject SSB ssb;作为 MainView 中的一个字段,我没有得到新的 SSB对于每个用户:
public class MainView {

@Inject
private SSB usersSSB;

public someMethod() {
usersSSB.doSomething();
System.identityHashCode( usersSSB );
}
}

使用两个用户进行测试,我得到了相同的 usersSSB 实例在两个用户的 session 中。我不认为这是可能的...我想,由于 SSB 是 SessionScoped,所以每个用户 session 都会被赋予一个新的,无论它在哪里 @Inject ed 它将引用该用户的 SSB .

相反,我尝试了:
public class MainView {

@Inject
private Instance<SSB> usersSSB;

public someMethod() {
usersSSB.get().doSomething();
System.identityHashCode( usersSSB.get() );
}
}

现在它报告了一个不同的 usersSSB最后,为每个用户。

这里发生了什么事?当我调用 usersSSB.get()稍后在每个用户的 session 中, usersSSB.get()每次都为同一个用户返回同一个bean?

我在 Glassfish 3.1.2 上运行。

更多信息

Application 类在新的 HttpServletRequest 上被注入(inject)到 Servlet 中:
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

ApplicationWrapperSessionScoped bean :
@SuppressWarnings("serial")
@SessionScoped
public class ApplicationWrapper implements Serializable {
@Inject
private AbstractCdiApplication application;

public AbstractCdiApplication getApplication() {
return application;
}
}

这不是说调用 @Inject SSB usersSSB MainView 中的任何位置(或该用户 session 中的任何对象)都应该为每个用户的 session 提供该用户的 session 范围 bean,并且始终为我提供相同的 session 范围 bean?含义——不同的usersSSB 用于不同的用户,因为每个用户都有不同的 session 。

毕竟, Application本身是一个 SessionScoped bean,由 getNewApplication 注入(inject)并附加到用户的 HTTP session servlet的方法?我的意思是,毕竟是 Application 对象注入(inject)并附加了 MainView 类,对吧?所以这意味着 MainView 是一个 session 范围的 bean,不是吗?

我只是想弄清楚这一切是如何运作的,我猜。谢谢您的帮助!

最佳答案

发生这种情况是因为 '@Inject Instance<>' 是动态获得的,与 '@Inject' 不同

如果您在 ApplicationScoped bean 中执行“@Inject”,则仅获得一次注入(inject),因此在 ApplicationScoped bean 中对于所有用户来说都是相同的引用

如果您在“@Inject Instance<>”上调用 .get(),则每次调用 .get() 时都会动态获取对 SSB 的引用

有关注入(inject)的更多信息,您可以在此处阅读:http://docs.jboss.org/weld/reference/1.1.0.Final/en-US/html/injection.html

关于jakarta-ee - 了解 cdi Instance<> 和 .get() 与 @Inject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9880231/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com