2010-03-17 22 views
4

这似乎是一个奇怪的问题(答案显然会生产,杜),但是如果你阅读Java文档:在应用程序服务器中用于Google Guice的正确生产阶段是什么?

/** 
    * We want fast startup times at the expense of runtime performance and some up front error 
* checking. 
*/ 
DEVELOPMENT, 

/** 
* We want to catch errors as early as possible and take performance hits up front. 
*/ 
PRODUCTION 

假设,你必须在应用程序服务器的无状态呼叫的情况下,最初的接收信号方法(或那里)为每个呼叫创建新的喷油器。如果在给定的调用中不需要所有模块绑定,那么使用开发阶段(这是默认设置)似乎更好,并且不会提前展现性能,因为您可能永远不会采用它,这里“前期”和“运行时间性能”之间的区别是没有意义的,因为它是一次调用。

当然,这样做的缺点似乎是您将失去错误检查功能,从而导致潜在的代码路径出现意外导致问题。

所以问题归结为上述正确的假设?当喷射器的给定寿命是一次呼叫时,您是否可以节省大量模块的性能?

+1

是否正在为每一个请求创建一个新的注入器,真的是你想要做的?这不是我们如何做(模子注射器)。 – 2010-03-17 22:30:15

+0

@凯文,我很乐意听到更好的选择。请注意,注入器具有一段状态(通过呼叫传递的认证令牌),每次呼叫都必须有所不同,因此仅将它存储在静态中不是一种选择。虽然我知道儿童注射器存在,但我从未考虑过他们能为我做些什么。 – Yishai 2010-03-17 22:40:34

+0

考虑辅助注射?或者也许是带种子值的SimpleScope? http://code.google.com/p/google-guice/wiki/CustomScopes – 2010-03-18 00:57:25

回答

4

应该没有必要为每个请求创建一个注入器。这并不是真正意义上的Guice意图 - 每个应用程序只需要一个Injector。喷油器实际上代表了应用程序的配置或接线,而不是短暂的状态。我想你需要看看使用Guice Scopes

GuiceServlet为您提供了@RequestScoped,它允许您将对象的生存期限制为HTTP请求,这听起来像您想要做的事情。

如果你不在Servlet中,你可以随时定义你自己的custom scope。这不是很复杂。

+0

感谢蒂姆,但不是像@RequestScoped那样的范围,就像每次创建注入器一样?无论如何,我解决的解决方案是创建一个儿童注射器,并确实将注射器保持静态。不确定这是否真的是100%的EJB规范,但它是有效的。 – Yishai 2012-02-03 17:19:23

+0

以有限的方式,是的。但是使用子喷射器来控制范围将会限制你的其他方面: 1.你将不能混合任何其他范围,因此子喷射器中的任何@Singleton实体将被丢弃。 2.您将在每个请求中创建喷油器的所有开销,这可能很重要。使用单一喷油器的一部分就是预先完成所有的装订工作。 – 2012-02-06 11:48:17

相关问题