为了账号安全,请及时绑定邮箱和手机立即绑定

Spring容器中的Singleton设计模式与Singleton bean

Spring容器中的Singleton设计模式与Singleton bean

斯蒂芬大帝 2019-10-08 11:13:47
众所周知,默认情况下,Spring容器中将bean作为单例,如果我们有一个基于Spring框架的Web应用程序,那么在这种情况下,我们真的需要实现Singleton设计模式来保存全局数据,而不仅仅是通过spring创建bean 。如果我无法解释我真正要问的问题,请忍受。
查看完整描述

4 回答

?
潇湘沐

TA贡献1816条经验 获得超6个赞

Spring中的单例豆和单例模式有很大不同。Singleton模式表示,每个类加载器将只创建一个特定类的一个实例。


Spring单例的范围被描述为“每个容器每个bean”。对于每个Spring IoC容器,单个对象实例的bean定义范围就是这样。Spring的默认范围是Singleton。


即使默认范围是单例,您也可以通过指定<bean ../>element 的scope属性来更改bean的范围。


<bean id=".." class=".." scope="prototype" />


查看完整回答
反对 回复 2019-10-08
?
POPMUISE

TA贡献1765条经验 获得超5个赞

Spring中的Singleton范围表示Spring上下文中的单个实例

。Spring容器仅一次又一次返回同一实例,以供后续调用以获取Bean。



而且,无论bean的类是否被编码为singleton,spring都不会打扰;实际上,如果该类被编码为其构造函数为private的singleton,Spring则使用BeanUtils.instantiateClass(此处为Javadoc )将构造函数设置为可访问并调用它。


或者,我们可以像这样在bean定义中使用factory-method属性


    <bean id="exampleBean" class="example.Singleton"  factory-method="getInstance"/>


查看完整回答
反对 回复 2019-10-08
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

让我们以最简单的示例为例:您有一个应用程序,而仅使用默认的类加载器。您有一个类,无论出于何种原因,您都决定该类在应用程序中不应有多个实例。(考虑一个由几个人共同处理应用程序的场景)。

如果您不使用Spring框架,则Singleton模式可确保您的应用程序中一个类的实例不超过一个。那是因为构造函数是私有的,所以无法通过执行“ new”来实例化类的实例。获取该类实例的唯一方法是调用该类的某些静态方法(通常称为“ getInstance”),该方法始终返回相同的实例。

说您在应用程序中使用Spring框架,仅意味着除了获取类实例的常规方法(返回类实例的新方法或静态方法)之外,您还可以要求Spring帮助您该类的实例,Spring会确保即使您未使用Singleton模式编写该类,只要您向其要求该类的实例,它将始终返回相同的实例。换句话说,即使该类具有公共构造函数,如果您始终向Spring请求该类的实例,则Spring在应用程序生命周期内只会调用该构造函数一次。

通常,如果使用Spring,则应仅使用Spring创建实例,并且可以为该类提供一个公共构造函数。但是,如果您的构造函数不是私有的,那么您实际上并不会通过绕过Spring来阻止任何人直接创建该类的新实例。

如果您确实想要该类的单个实例,即使您在应用程序中使用Spring并将Spring中的类定义为单例,那么确保该类的唯一方法就是也使用Singleton模式实现该类。这样可以确保只有一个实例,无论人们使用Spring获取实例还是绕过Spring。


查看完整回答
反对 回复 2019-10-08
?
慕田峪7331174

TA贡献1828条经验 获得超13个赞

在Spring中,Singleton作用域意味着该bean将仅由Spring实例化一次。与原型范围(每次都有新实例)相反,请求范围(每个请求一次),会话范围(每个HTTP会话一次)。

从技术上讲,单例范围与单例设计模式有关。您无需将bean实施为单例即可将它们放入单例范围。


查看完整回答
反对 回复 2019-10-08
  • 4 回答
  • 0 关注
  • 676 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信