Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 什么时候适合在Micronauts中使用@Singleton和@Prototype?_Kotlin_Design Patterns_Singleton_Micronaut - Fatal编程技术网

Kotlin 什么时候适合在Micronauts中使用@Singleton和@Prototype?

Kotlin 什么时候适合在Micronauts中使用@Singleton和@Prototype?,kotlin,design-patterns,singleton,micronaut,Kotlin,Design Patterns,Singleton,Micronaut,我读了很多关于singleton模式()的不好的东西,然而,@singleton在这个Micronaut文档中无处不在,用来说明控制反转 何时使用@Singleton?例如,如果我有一个UserInfoService具有getUserInfo,createUserInfo,updateUserInfo方法,那么使用@Singleton是一个好主意吗 另一个单独的问题是何时使用@Prototype,因为如果我不对函数/类使用任何注释,它在默认情况下不是原型吗(就像我在另一个类/函数中启动它的新实例

我读了很多关于singleton模式()的不好的东西,然而,
@singleton
在这个Micronaut文档中无处不在,用来说明控制反转

何时使用
@Singleton
?例如,如果我有一个
UserInfoService
具有
getUserInfo
createUserInfo
updateUserInfo
方法,那么使用
@Singleton
是一个好主意吗

另一个单独的问题是何时使用
@Prototype
,因为如果我不对函数/类使用任何注释,它在默认情况下不是原型吗(就像我在另一个类/函数中启动它的新实例一样)

何时使用@Singleton合适?例如,如果我有一个 具有getUserInfo、createUserInfo、updateUserInfo的UserInfoService 方法,使用@Singleton是个好主意吗

UserInfoService
几乎肯定应该是无状态的单例

另一个单独的问题是何时使用@Prototype,因为如果 不要对函数/类使用任何注释,默认情况下不是吗 原型(例如,我在另一个数据库中启动了一个新的实例) 类别/功能)

如果启动一个新实例,那么注释就无关紧要了。注释仅影响Micronaut容器为您创建的实例。对于
@Singleton
,容器创建一个实例,并在所有需要它的注入点注入相同的实例。对于
@Prototype
,容器为每个注入点创建一个新实例

所有这些都与应用程序设计有关,而不是与Micronaut有关。Micronaut为您提供了一种简单的机制,可以声明性地表示(通过
@Singleton
@Prototype
)您是否希望共享同一实例,但问题实际上与应用程序设计有关。一般来说,您应该更喜欢无状态的单身汉。如果出于某种原因,您有一个必须是有状态的bean,并且您有充分的理由不想共享来自不同上下文的实例,那么
@Prototype
可能是合适的


我希望这会有所帮助。

让我们100%清楚地看到,GoF单例设计模式和
@Singleton
注释是两件不同的事情

考虑到单例设计模式要求您更改代码。必须以防止多次实例化的方式编写代码

另一方面,您可以将
@Singleton
注释添加到您喜欢的任何类中,而无需修改其代码以防止实例化;正如@Jeff Scott Brown所指出的,您可以通过简单地调用它的构造函数来反复实例化这个Micronaut“Singleton”

@Singleton
注释不会显示您在Singleton设计模式中读到的那些负面后果,因为它没有实现Singleton设计模式。这个词在这里有两个不同的意思

另一方面,
@Prototype
注释也不遵循GoF原型设计模式。

由于涵盖了您问题的大部分,您必须注意Spring中的单例范围单例模式之间的细微差别

这两者之间的一些主要区别是

  • Singleton模式确保每个特定类的一个实例 类加载器
  • SpringSingleton是“每个容器每个bean”
希望有帮助