Bean 的作用域
- 在Spring中不仅可以完成Bean的实例化,还可以为Bean指定作用域。
Bean的作用域
- singleton: 默认的作用域,使用singleton定义的Bean在Spring容器中只有一个Bean实例
- prototype: Spring容器每次获取prototype定义的Bean,容器都会创建一个新的Bean实例
- request : 在一次Http请求中容器将返回一个Bean实例,不同的Http请求返回不同的Bean实例。仅在Web Spring应用程序上下文中使用
- session :在一个HTTP Session中,容器将返回同一个Bean实例。仅在Web Spring应用程序上下文中使用
- application: 为每个ServletContext对象创建一个实例,即同一个应用共享一个Bean实例,仅在WEB Spring应用程序上下文中使用
- websocket: 为每个WebSocket对象创建一个Bean实例。仅在Web Spring应用程序上下文中使用
singleton以及prototype是最常用的两种
singleton作用域
- 当将bean的scope设置为singleton时,springIOC容器仅生成和管理一个Bean实例。在使用id或name获取Bean实例时,Ioc容器将返回共享的Bean实例。
- 由于singletion是scope默认方法,因此有两种方法将bean的scope设置为singletion。
<bean id="constructorInstance" class="instance.BeanClass"/>
或
<bean id="consttuctorInstance" class="instance.BeanClass" scope="singletion/>
- 测试代码
package test;
import instance.BeanClass;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestInstance {
public static void main(String[] args) {
//初始化Spring容器applicationContext,加载配置文件
ApplicationContext appCon=new ClassPathXmlApplicationContext("applicationContext");
// 测试构造方法实例化Bean
BeanClass b1=(BeanClass) appCon.getBean("constructorInstance");
System.out.println(b1+b1.message);
BeanClass b2= (BeanClass) appCon.getBean("constructorInstance");
System.out.println(b2+b2.message);
}
}
结果
prototype作用域
当将bean的scope设置为prototype时,Spring Ioc容器将每次请求创建一个新的实例。