我在一个新项目上使用了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请求中)。
我怎么能那样做?
谢谢你!!!!
-瑞恩
好的,我知道了。
我真正想做的是在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
谢谢大家的帮助!!
有很多方法可以解决这个问题。如果您知道应用程序在启动时是处于“批处理”模式还是正常模式,您可以这样做:
@Override
public void configure() {
if (isInBatchMode) {
bind(ApplicationConfiguration.class)
.toInstance(batchInstance);
} else {
bind(ApplicationConfiguration.class)
.toProvider(ApplicationConfigurationProvider.class)
.in(RequestScoped.class);
}
}
其中,isInBatchMode
和batchInstance
被传递到模块
。或者,您可以制作两个不同的模块,并根据配置等安装不同的模块。
您还可以编写一个自定义提供程序,如果您在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 --