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 的生命期也不一定会停止。所有的变量受到所有调用它的用户的影响(类似于静态声明)。