Kotlin 什么时候适合在Micronauts中使用@Singleton和@Prototype?
我读了很多关于singleton模式()的不好的东西,然而,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
在这个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”李>