当前位置: 首页 > 知识库问答 >
问题:

Guice:当我已经拥有实例时,如何使用实例而不是提供程序

徐瀚
2023-03-14

我在一个新项目上使用了Guice 4.0 Beta 2,之前在一个项目上使用了Guice 3.0。

在我当前的项目中,有一个ApplicationConfiguration对象,它是使用ApplicationConfigurationProvider从HTTP请求派生的:

  @Inject
  public ApplicationConfigurationProvider(HttpServletRequest request)
  {
    this.request = request;
  }

  @Override
  public ApplicationConfiguration get()
  {
    ApplicationConfiguration app = null;

    Map<String, ApplicationConfiguration> appMap = 
            (Map<String, ApplicationConfiguration>) request.getSession()
            .getServletContext()
            .getAttribute(ContextKeys.APPLICATION_CONFIGURATIONS.toString());

    //get the host.....
    String host = request.getServerName();
    if(host.equals("localhost"))
    {
      app = appMap.get("abcclient");
    }
    else
    {
      app = appMap.get("xyzclient");
    }

    return app;
  }

绑定看起来像这样:

bind(ApplicationConfiguration.class).toProvider(ApplicationConfigurationProvider.class).in(RequestScoped.class);

到目前为止还不错。这和预期的一样。请注意,其他Provider类依赖于将Application ationConfiguration注入其中。

这就是我遇到麻烦的地方:我有一些批次处理作业需要进行。批处理过程不是由HTTP请求启动的。我有正确的应用配置实例可用(它不需要通过使用HTTP请求来选择),但是我不知道如何绑定它,或者告诉注入器使用这个实例而不是应用配置提供程序。

我想我可以创建一个自定义作用域,并使用我想用于该作用域的ApplicationConfiguration实例为其种子,但它不起作用。我使用Guice wiki上的示例创建了自定义范围。

我想我可以将应用程序配置绑定到自定义范围中的其他类型的提供程序,但这也不起作用,因为Guice只允许绑定一次特定的键。

总之,我需要将Application ationConfiguration绑定到在批处理模式下(当请求外部可用时)已经拥有的特定实例,并在HTTP请求内部使用Application ationConfiguratoniProvider。我希望如果我有应用配置实例,它将被注入的其他提供程序将像现在一样工作(在HTTP请求中)。

我怎么能那样做?

谢谢你!!!!

-瑞恩

共有2个答案

夹谷弘亮
2023-03-14

好的,我知道了。

我真正想做的是在HTTP请求之外重用RequestScope,但我认为这并不容易。事实证明是的,ServletScopes。scopeRequest方法是我所需要的。

Guice论坛上的这一评论实际上引导我走上了正确的道路:

https://groups.google.com/d/msg/google-guice/ozexD9etcXI/40kbz1PDdIEJ

我用注入器绑定中定义的几个请求范围变量播种了种子地图,创建了Callable,如图所示,并且它工作了!

这里是JavaDoc,它说scopeRequest方法正是我想要它做的:

http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/servlet/ServletScopes.html

谢谢大家的帮助!!

东明德
2023-03-14

有很多方法可以解决这个问题。如果您知道应用程序在启动时是处于“批处理”模式还是正常模式,您可以这样做:

@Override
public void configure() {
    if (isInBatchMode) {
        bind(ApplicationConfiguration.class)
                .toInstance(batchInstance);
    } else {
        bind(ApplicationConfiguration.class)
                .toProvider(ApplicationConfigurationProvider.class)
                .in(RequestScoped.class);
    }
}

其中,isInBatchModebatchInstance被传递到模块。或者,您可以制作两个不同的模块,并根据配置等安装不同的模块。

您还可以编写一个自定义提供程序,如果您在HTTP请求中,该提供程序将从请求返回实例,否则将返回“批处理”实例。可以检查是否在具有自定义筛选器的HTTP请求中。

 类似资料:
  • 我正试图使用ITest接口从数据提供商处获取测试的自定义名称(用于Jenkins reports)。我尝试了下面这样的示例程序,以了解TestNG在什么时候调用gettestname()方法。 粘贴输出和程序。 正如你在下面看到的那样,输出是令人困惑的,有些地方测试名称也是“空”的。所以我的问题是Itest是否被设计用于数据提供商?此外,当我们使用并行=true运行下面的数据提供程序时,它会变得更

  • 问题内容: 如果我在文件中进行设置,那么什么时候管理创建新实例以服务请求,何时在现有实例上创建新线程的规则是什么? 如果我有一个在每个请求上执行计算量大的应用程序,那么多线程能给我带来什么好处吗?换句话说,实例是多核实例还是单核? 或者,仅当现有线程正在等待IO时才启动新线程吗? 问题答案: 当前使用以下规则集确定给定实例是否可以接受新请求: 以下总的CPU /核心限制目前适用于每个实例类: 因此

  • 问题内容: 我被困在创建SSLContext(我想用来实例化SSLEngine来通过java-nio处理加密传输)的过程中: 代码 引发以下异常: 我将Bouncy Castle的当前提供程序包“ bcprov- jdk15on-150.jar”(从此处获得)附加到了应用程序类路径以及它的引导类路径(通过VM- Option -Xbootclasspath / p),但是都没有解决问题。我也尝试了

  • 问题内容: 我们可以在Android中拥有服务的多个实例吗?我想要一种可以在特定时间使手机静音的服务,并且我想重新使用该服务以使手机在特定时间处于振动模式。因此,基本上,如果我可以使该服务多次运行,则无需创建其他服务即可将手机设置为振动模式。另外,如果我们可以运行多个实例,请说明如何停止它。任何代码提示都会有很大帮助。 问题答案: 我们可以在Android中拥有服务的多个实例吗? 不能。您可以具有

  • 我需要一个关于如何使用Google-guice为服务的多个实现编写代码的建议。下面是示例 因为Guice不允许将一个类型绑定到多个实现,因为下面的代码会导致错误 我们可以用下面的命名注释来解决这个问题 但我工作的应用程序是这样的。我们在init()方法中绑定所有模块并创建注入器模块: 但是通过上述过程,我可以将一个实现类绑定到接口(服务类) 你能给我提供一个方法来与供应商合作吗。我想在下面这样做

  • 用户数据文件时在元数据服务中的一个特殊的键,它保存了一份能给虚拟机实例中的云服务使用的文件。比如,cloud-init程序便使用了用户数据文件,这个程序是一个源自Ubuntu的开源包,能用在多个Linux发行版上,它可以接管云实例的初始化过程。 您可以将用户数据写在一份本地文件中,然后在创建实例时用--user-data <user-data-file>参数将其传入。 $ nova boot --