快捷搜索: 王者荣耀 脱发

Sping 中 singleton(单例)和 prototype(多例) 的理解

Singleton:

当一个 bean 的作用域为 singleton(单例)时,IOC 容器中只会存在一个共享的 bean 实例,且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。也就是说,这个单一实例被存储到单例缓存中,以后所有针对该 bean 的后续请求和引用都返回这个缓存的对象实例,IOC 容器中只存在一个该 bean。

Prototype:

每一次请求都会产生一个新的 bean 实例(相当于每个用户所产生的 bean 实例都不同)。 对于 prototype 任何配置好的析构生命周期回调方法都不会被调用,清除 prototype 作用域的对象释放资源是客户端代码的职责。 (可以使用 bean 的后置处理器,该处理器持有要被清除的 bean 的引用)

总结:

对有状态的 bean 要使用 prototype 作用域 对无状态的 bean 使用 singleton 作用域

有状态的 bean :

每个用户有自己特有的一个实例,一旦用户调用结束或实例结束,bean 的生命期亦结束。

无状态的 bean :

被所有用户所共享,及时用户调用结束或实例结束,bean 的生命期也不一定会停止。所有的变量受到所有调用它的用户的影响(类似于静态声明)。

另:在 Spring boot 中,可以添加 @Scope(“prototype”) 改变为多例(默认为单例)

经验分享 程序员 微信小程序 职场和发展