singleton
和prototype
(单例和多例)作用域 在任何的spring框架IOC容器都可用。
作用域类型 | 简介 |
---|---|
singleton (默认单例) |
spring框架的 IoC 容器中只有单个实例。 |
prototype |
与单例相反, 多例会在每次使用他的时候创建一个新的实例. |
request |
在HTTP request的完整生命周期中,将创建并提供一个实例。 只在web感知的Spring ApplicationContext中有效。 |
session |
在HTTP session的整个生命周期中,将创建一个单一的实例并使其可用。 只在web感知的Spring ApplicationContext中有效。 |
application |
在ServletContext的完整生命周期中,将创建并提供一个实例。 只在web感知的Spring ApplicationContext中有效。 |
websocket |
WebSocket的完整生命周期中将创建并提供一个实例。 Only valid in web-aware Spring |
singleton
是spring容器中的默认bean作用域。 它告诉容器创建和管理每个容器只有一个bean类的实例。 这个单实例存储在这样的单例bean的缓存中,并且该命名bean的所有后续请求和引用都会返回缓存的实例。@Component
@Scope("singleton")//这个语句其实是多余的 - 单例是默认范围
public class BeanClass {
}
同样,下面是一个基于xml配置的方式:
<!-- 指定单例作用域是多余的 -->
<bean id="beanId" class="com.leftso.BeanClass" scope="singleton" />
//或者
<bean id="beanId" class="com.leftso.BeanClass" />
prototype
(多例)作用域,每一次请求使用到该bean都会被应用创建一个新的实例。prototype
作用域的beans,只有在初始化回调方法的时候调用。因此作为开发人员,应该负责清理prototype
作用域的beans实例和他们挂着的其他资源。@Component
@Scope("prototype")
public class BeanClass {
}
下面是xml的方式:
<bean id="beanId" class="com.leftso.BeanClass" scope="singleton" />
request
范围中,容器为每个HTTP请求创建一个新的实例。因此,如果服务器正在处理50个请求,然而容器最多可以创建50个单独bean的实例。 任何状态更改为一个实例,其他实例将不可见。 这些实例一旦请求完成就被销毁。@Component
@Scope("request")
public class BeanClass {
}
//或者
@Component
@RequestScope
public class BeanClass {
}
xml配置例子:
<bean id="beanId" class="com.leftso.BeanClass" scope="request" />
session
作用域,容器为每个HTTP会话创建一个新的实例。因此,如果服务器有20个活动会话,并且容器最多可以有20个单独的bean类实例。在单个会话生命周期内的所有HTTP请求将有权访问该会话作用域中相同的单个bean实例。@Component
@Scope("session")
public class BeanClass {
}
//or
@Component
@SessionScope
public class BeanClass {
}
xml配置例子:
<bean id="beanId" class="com.leftso.BeanClass" scope="session" />
application
作用域中,容器每个Web应用程序运行时创建一个实例 它几乎类似于单一的范围,只有两个不同之处,即:
application
范围的bean是每个ServletContext
单例,而singleton
范围的bean是每个ApplicationContext单例。 请注意,单个应用程序可以有多个应用程序上下文。application
范围的bean作为一个ServletContext
属性是可见的。@Component
@Scope("application")
public class BeanClass {
}
//or
@Component
@ApplicationScope
public class BeanClass {
}
xml配置例子:
<bean id="beanId" class="com.leftos.BeanClass" scope="application" />
@Component
@Scope("websocket")
public class BeanClass {
}
xml配置例子:
<bean id="beanId" class="com.howtodoinjava.BeanClass" scope="websocket" />
请注意,websocket范围的bean通常是单身,比任何单独的WebSocket会话寿命更长。thread
作用域。 要使用此范围,您必须使用CustomScopeConfigurer
类将其注册到容器。
<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
<property name="scopes">
<map>
<entry key="thread">
<bean class="org.springframework.context.support.SimpleThreadScope"/>
</entry>
</map>
</property>
</bean>
每个bean的请求都会在同一个线程中返回相同的实例。@Component
@Scope("thread")
public class BeanClass {
}
xml配置例子:
<bean id="beanId" class="com.howtodoinjava.BeanClass" scope="thread" />
https://www.leftso.com/article/301.html