Spring为Bean定义了5种作用域,分别为Singleton(单例)、Prototype(原型)、Request(请求级别)、Session(会话级别)、和Global Session(全局会话)。
-
Singleton:Singleton是单例模式,当实例类型为单例模式时,Spring IoC容器中只会存在一个共享的Bean实例,无论有多少个Bean引用它,都始终指向同一个Bean对象。该模式在多线程下是安全的。Singleton作用域是Spring中的默认作用域,也可以通过配置将Bean定义为Singleton模式,具体配置如下。
<bean id="userDao" class="com.example.UserDaoImpl" scope="singleton />
-
Prototype:是原型模式,每次通过Spring容器获取Prototype定义的Bean时,容器都将创建一个新的Bean实例,每个Bean实例都有自己的属性和状态,而Singleton全局只有一个对象。因此,对有状态的Bean经常使用Prototype作用域,而对无状态Bean则使用Singleton作用域,具体配置如下:
<bean id=""userService" class="com.example.UserService" socpe="prototype" />
-
Request:只在一次HTTP请求中容器会返回该Bean的同一个实例,而对不同的HTTP请求则会创建新的Bean实例,并且该Bean实例仅在当前HTTP请求内有效,当前HTTP请求结束后,该Bean实例也将会随之被销毁。具体配置如下。
<bean id="loginController" class="com.example.LoginController" scope="request" />
-
Session:指在一次HTTP Session中容器会返回该Bean的同一个实例,而对不同的Session请求则会创建出新的Bean实例,该Bean实例仅在当前Session内有效。和HTTP请求相同,每一次Session都会创建新的Bean实例,而不同的Bean实例之间不共享数据,且Bean实例仅在自己的Session内有效,请求结束,则Bean实例将随之被销毁,具体配置如下。
<bean id="userSession" class="com.example.userSession" scope="session" />
-
Golbal Session:Global Session指在一个全局的HTTP Session中容器会返回该Bean的同一个实例,且仅在使用Portlet Context时有效。