为什么guice不会注入先前实例化的@SessionScoped对象?

时间:2011-02-04 09:46:57

标签: java session-state guice stripes

我有一个@SessionScoped? DAO被注入到Stripes框架Interceptor构造函数中,似乎是从拦截器(在后续调用中)找到的,但是没有被注入到同一请求(和会话)中的服务中。为什么不在服务中重用相同的实例(在拦截器中初始化)(在同一个项目中的不同包中)?

使DAO成为@Singleton可以解决问题,但是这是不可接受的,因为DAO存储的信息必须在具有多个用户共享同一DAO实例的应用程序的整个用户会话中保持一致。

2 个答案:

答案 0 :(得分:0)

如果Interceptor不是会话范围的对象,那么您需要将Provider<YourDaoType>注入Interceptor。这是生命周期较长的物体依赖于寿命较短的另一物体时常用的模式。

答案 1 :(得分:0)

好吧,我已经明白了。我将@SessionScoped更改为注释有效的bind(DAO.class).in(ServletScopes.SESSION)语句。据我所知,这些应该是等价的,但就我而言,它们会产生不同的结果。

令我困扰的一个方面是Stripes构建了在启动时注入DAO的拦截器导致错误,因为这发生在会话范围之外(DAO为@SessionScoped。ActionBeanContext上下文信息是需要初始化我在构造动作bean期间调用的AbstractActionBean setContext方法中设置的DAO会话上下文。

感谢您的关注和帮助。