【问题标题】:Why isn't guice injecting the previously-instantiated @SessionScoped object?为什么 guice 不注入先前实例化的 @SessionScoped 对象?
【发布时间】:2011-06-21 06:14:24
【问题描述】:

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

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

【问题讨论】:

标签: java session-state guice stripes


【解决方案1】:

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

【讨论】:

  • 感谢您的回答。 (单例)拦截器的寿命比(会话范围的)DAO 长,尽管 guice 甚至没有在单个请求中注入原始 DAO 实例。
  • 调试显示 guice 调用 DAO 的构造函数,而不是使用(会话附加?)实例。
  • 能否包含用于绑定 DAO 的代码和拦截器的代码?
【解决方案2】:

好的,我想通了。我将@SessionScoped 更改为bind(DAO.class).in(ServletScopes.SESSION) 注入工作的语句。据我了解,这些应该是等效的,但在我的情况下,它们会产生不同的结果。

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

感谢您的关注和帮助。

【讨论】:

    猜你喜欢
    • 2013-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    • 2014-08-23
    • 1970-01-01
    相关资源
    最近更新 更多