4 回答
TA贡献1816条经验 获得超6个赞
Spring中的单例豆和单例模式有很大不同。Singleton模式表示,每个类加载器将只创建一个特定类的一个实例。
Spring单例的范围被描述为“每个容器每个bean”。对于每个Spring IoC容器,单个对象实例的bean定义范围就是这样。Spring的默认范围是Singleton。
即使默认范围是单例,您也可以通过指定<bean ../>element 的scope属性来更改bean的范围。
<bean id=".." class=".." scope="prototype" />
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"/>
TA贡献1816条经验 获得超4个赞
让我们以最简单的示例为例:您有一个应用程序,而仅使用默认的类加载器。您有一个类,无论出于何种原因,您都决定该类在应用程序中不应有多个实例。(考虑一个由几个人共同处理应用程序的场景)。
如果您不使用Spring框架,则Singleton模式可确保您的应用程序中一个类的实例不超过一个。那是因为构造函数是私有的,所以无法通过执行“ new”来实例化类的实例。获取该类实例的唯一方法是调用该类的某些静态方法(通常称为“ getInstance”),该方法始终返回相同的实例。
说您在应用程序中使用Spring框架,仅意味着除了获取类实例的常规方法(返回类实例的新方法或静态方法)之外,您还可以要求Spring帮助您该类的实例,Spring会确保即使您未使用Singleton模式编写该类,只要您向其要求该类的实例,它将始终返回相同的实例。换句话说,即使该类具有公共构造函数,如果您始终向Spring请求该类的实例,则Spring在应用程序生命周期内只会调用该构造函数一次。
通常,如果使用Spring,则应仅使用Spring创建实例,并且可以为该类提供一个公共构造函数。但是,如果您的构造函数不是私有的,那么您实际上并不会通过绕过Spring来阻止任何人直接创建该类的新实例。
如果您确实想要该类的单个实例,即使您在应用程序中使用Spring并将Spring中的类定义为单例,那么确保该类的唯一方法就是也使用Singleton模式实现该类。这样可以确保只有一个实例,无论人们使用Spring获取实例还是绕过Spring。
TA贡献1828条经验 获得超13个赞
在Spring中,Singleton作用域意味着该bean将仅由Spring实例化一次。与原型范围(每次都有新实例)相反,请求范围(每个请求一次),会话范围(每个HTTP会话一次)。
从技术上讲,单例范围与单例设计模式有关。您无需将bean实施为单例即可将它们放入单例范围。
添加回答
举报