1.bean标签中的scope属性
在bean标签中,可以使用scope属性来设置当前bean对象的作用域,默认为singleton(单例),由IOC容器负责创建和管理,除了使用xml进行配置之外,还可以使用@Scope注解来配置
2. singleton
singleton:单例;由IOC容器进行创建管理,每一个IOC都会创建某一对象的唯一实例
示例:在xml配置文件中不设置scope属性(即默认singleton),获得两个相同的bean对象
配置文件:
<bean id="book1" class="com.oracle.vo.Book">
<property name="isbn" value="1236"></property>
<property name="bookName" value="活着"></property>
<property name="price" value="65"></property>
</bean>
java测试:
@org.junit.Test
public void testInsert() {
ApplicationContext factory=new ClassPathXmlApplicationContext("applicationContext.xml");
Book b1=(Book) factory.getBean("book1");
Book b2=(Book) factory.getBean("book1");
System.out.println(b1==b2);
}
输出结果:true
3.prototype
prototype:原型,即每次使用getBean()方法时都会创建一个新的bean实例
将上述配置文件中加入`scope="prototype"`
测试输出为:false
4.request
request:对于每次HTTP请求,使用request定义的Bean都将产生一个新实例
即每次HTTP请求将会产生不同的Bean实例。只有在Web应用中使用Spring时,该作用域才有效(非web项目会抛出运行时异常)
5.session
session:对于每次HTTP请求,使用session定义的bean将会对每个session产生一个新实例。同样只有在Web应用中使用Spring时,该作用域才有效
7.说明
在开发过程中比较常用的是singleton和prototype两种作用域。对于singleton作用域的Bean,每次请求该Bean都将获得相同的实例。容器负责跟踪Bean实例的状态,负责维护Bean实例的生命周期行为;如果一个Bean被设置成prototype作用域,程序每次请求该id的Bean,Spring都会通过new的方式来创建实例,然后返回给程序,容器不再跟踪实例,也不会维护Bean实例的状态。
在开发过程中,使用Spring创建的对象,大多数都是无状态的对象,如Dao,service,controller等一些只是用来提供业务操作方法的对象。如果不指定Bean的作用域,Spring默认使用singleton作用域。Java在创建Java实例时,需要进行内存申请;销毁实例时,需要完成垃圾回收,这些工作都会导致系统开销的增加。因此,prototype作用域Bean的创建、销毁代价比较大。而singleton作用域的Bean实例一旦创建成功,可以重复使用。因此,除非必要,否则尽量避免将Bean被设置成prototype作用域。