Play框架编译时依赖注入和单例
Play framework compile-time dependency injection and singleton
我一直在重构我的 Play 应用程序,从使用 Guice 到使用编译时 DI。
在Guice中,当我们不用@Singleton
修饰一个class时,可以根据需要创建很多实例。
在编译时DI中,我们创建一个实例,只注入一次,所以我认为它相当于一个单例。
我的问题是,如果我将所有内容都限制为仅一个实例,是否会损失任何性能。例如,如果我有一个实例 serviceA
,方法 doSomething
,并且考虑到一切都是无状态的。如果我有一个 32 核 CPU,并且有很多请求进来。在编译时 DI 的上下文中,Play 是否能够利用 CPU 的全部容量?
AFAiK Guice(和其他运行时 DI 框架)默认情况下不会生成单例,其唯一原因是在创建实例时更快并简化复杂(可能循环)的依赖关系图。他们的目标是更快地开始。
无论您有 1 个还是 2 个 ServiceA
实例,都不会影响这些实例创建后的使用性能。
理论上单例更好。
我一直在重构我的 Play 应用程序,从使用 Guice 到使用编译时 DI。
在Guice中,当我们不用@Singleton
修饰一个class时,可以根据需要创建很多实例。
在编译时DI中,我们创建一个实例,只注入一次,所以我认为它相当于一个单例。
我的问题是,如果我将所有内容都限制为仅一个实例,是否会损失任何性能。例如,如果我有一个实例 serviceA
,方法 doSomething
,并且考虑到一切都是无状态的。如果我有一个 32 核 CPU,并且有很多请求进来。在编译时 DI 的上下文中,Play 是否能够利用 CPU 的全部容量?
AFAiK Guice(和其他运行时 DI 框架)默认情况下不会生成单例,其唯一原因是在创建实例时更快并简化复杂(可能循环)的依赖关系图。他们的目标是更快地开始。
无论您有 1 个还是 2 个 ServiceA
实例,都不会影响这些实例创建后的使用性能。
理论上单例更好。