我刚刚从我的高级中听说,即使我在该具体类中添加了@Singleton注释并且它在系统中无缝地工作,我也无法将具体类实例化为Singleton而不使用依赖注入中的接口。但他这样说,就是创建了多个类实例,他提到了。
我正在使用带有Guice DI的Play Scala框架。
我尝试谷歌搜索验证是否正确,但我找不到答案。
有人可以给我一个具体的解释吗?在java中,我可以创建一个没有接口的Singleton类。
答案 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而无需提供接口