通过Play Framework创建没有界面的单例对象

时间:2016-07-27 07:12:30

标签: scala playframework dependency-injection guice

我刚刚从我的高级中听说,即使我在该具体类中添加了@Singleton注释并且它在系统中无缝地工作,我也无法将具体类实例化为Singleton而不使用依赖注入中的接口。但他这样说,就是创建了多个类实例,他提到了。

我正在使用带有Guice DI的Play Scala框架。

我尝试谷歌搜索验证是否正确,但我找不到答案。

有人可以给我一个具体的解释吗?在java中,我可以创建一个没有接口的Singleton类。

2 个答案:

答案 0 :(得分:1)

如果您的意思是,是否有可能在没有“伴侣”列车的情况下立即注入课程,并且在模块中实施具有约束力的特性,那么这是可能的。 我刚刚做过实验。这是我的简单课程: 包裹服务

import javax.inject.Singleton

/**
  * Created by Alex on 7/27/2016.
  */
@Singleton
class JustASingleton {
  def giveMeFive = "5"
}

然后在我的控制器中,我注入它没有任何特征(你调用的接口):

class MainController @Inject()(
                                environment:play.api.Environment,
                                documentService:DocumentService,
                                userService:UserService,
                                singletonInstance:JustASingleton
                              )(implicit ec:ExecutionContext)extends Controller {


  def testSingletonInjection() = Action(Ok(singletonInstance.giveMeFive))
  ...

然后在路线中我有一行:

GET     /singleton                  controllers.MainController.testSingletonInjection

它编译好了,当我去localhost:9000 / singleton然后我得到一个正确的HTML响应。因此,没有特征的注入和将实现绑定到特征确实有效。

答案 1 :(得分:0)

为了保存记录,我会发布答案。

我试图扩展@AlexanderArendar的实验:

import javax.inject.Singleton

/**
  * Created by Alex on 7/27/2016.
  */
@Singleton
class JustASingleton {
  def giveMeFive = "5"
}

第一控制器

class MainController @Inject()(
                                environment:play.api.Environment,
                                documentService:DocumentService,
                                userService:UserService,
                                singletonInstance:JustASingleton
                              )(implicit ec:ExecutionContext)extends Controller {


  def testSingletonInjection() = Action(Ok("controller id " + System.identityHashCode(this).toString + " and Injected Bean id " + System.identityHashCode(singletonInstance).toString))
  ...

第二控制器

class SecondController @Inject()(
                                    environment:play.api.Environment,
                                    documentService:DocumentService,
                                    userService:UserService,
                                    singletonInstance:JustASingleton
                                  )(implicit ec:ExecutionContext)extends Controller {


      def testSingletonInjection() = Action(Ok("controller id " + System.identityHashCode(this).toString + " and Injected Bean id " + System.identityHashCode(singletonInstance).toString))
      ...

然后在路线

GET     /singletonX                  controllers.MainController.testSingletonInjection

GET     /singletonY                  controllers.SecondController.testSingletonInjection

调用这两个端点给了我以下结果:

  

controller id 1944357758 and Injected Bean id 853668078

     

controller id 943948501和Injected Bean id 853668078

我可以根据测试得出结论,具体类可以创建为Singleton而无需提供接口