Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Servlets @injectannotation何时开始在Servlet中注入SessionScoped bean?_Servlets_Jsf 2_Cdi - Fatal编程技术网

Servlets @injectannotation何时开始在Servlet中注入SessionScoped bean?

Servlets @injectannotation何时开始在Servlet中注入SessionScoped bean?,servlets,jsf-2,cdi,Servlets,Jsf 2,Cdi,我需要修改Servlet中的用户会话对象(SessionScopedBean-CDI),因此我必须以某种方式获得该bean。我使用注射的方式如下: @Inject private UserSession user; 其中UserSession是SessionScoped的cdibean。从doPost或doGet servlet方法调用用户方法。 这是完美的;每次@InjectAnnotation注入适当的UserSessionbean时,我都不明白这是如何实现的 我假设用@Inject注释的

我需要修改Servlet中的用户会话对象(SessionScopedBean-CDI),因此我必须以某种方式获得该bean。我使用注射的方式如下:

@Inject
private UserSession user;
其中UserSession是SessionScoped的cdibean。从doPost或doGet servlet方法调用用户方法。 这是完美的;每次@InjectAnnotation注入适当的UserSessionbean时,我都不明白这是如何实现的

我假设用@Inject注释的bean只被注入一次(在本例中,当对象-Servlet实例-被创建时),但这显然是一个错误的假设


那么,何时将这些bean注入servlet?按要求?当存在多个UserSession对象时,这种方法如何避免冲突(一个servlet实例-多个线程来处理冲突)?

您的答案在于CDI的C,它代表上下文

所发生的不是实际的bean被注入,而是一个代理。此代理是上下文的,并根据代表代理执行的调用方的上下文解析为实际会话范围的bean。

CDI使用。注入的实例实际上不是真实实例,而是一个代理,它根据当前上下文定位真实实例,并将所有方法委托给它(就像EJB如何工作一样)。
UserSession
bean的自动生成类大致如下所示:

public UserSessionCDIProxy extends UserSession implements Serializable {

    public String getSomeProperty() {
        UserSession instance = CDI.resolveItSomehow();
        return instance.getSomeProperty();
    }

    public void setSomeProperty(String someProperty) {
        UserSession instance = CDI.resolveItSomehow();
        instance.setSomeProperty(someProperty);
    }

}
此机制允许您在范围更广的实例中插入范围更窄的实例,并允许您在当前上下文中仍然获得预期的实例。标准的JSF
@ManagedProperty
注释不支持它,因为它不使用代理,而是直接注入所需的实例。这就是为什么不可能通过
@ManagedProperty
注入范围更窄的内容

另见: