在Spring的Bean中有一个属性scope是用来配置Spring Bean的作用域,它标识Bean的作用域
在Spring 2.0之后默认有五种类型的Bean:
singleton、prototype、request、session、global session(application)
其中,后三种是用于WEB中的Bean对象,下边会有介绍。
PS:需要注意的一点就是,如果Bean没有设置作用域的时候,默认是singleton类型
一、.singleton和.prototype类型
1、singleton
当一个Bean的作用域设置为.singleton,Srping IOC容器中仅仅会存在一个共享的bean实例。
在所有对bean的请求中,只要请求的id与bean的id相同,则他们返回的实例都是同一个。
即当设置为singleton的时候,容器只会创建唯一的一个实例。这个单一实例会被存储到单例缓存(singleton cache)中,并且所有针对该bean的后续请求和引用都将返回被缓存的对象实例。
可以看看如下的代码就应该能够明白了:
这是配置文件beans.xml
<bean id="personService" class="cn.itcast.service.impl.PersonServiceBean" scope="singleton">这是测试文件 SpringTest.java :
</bean>
public void instanceSpring() {最后的输出结果是: true 。证明这两个实例是同一个实例。
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
PersonService personService1 = (PersonService)ctx.getBean("personService");
PersonService personService2 = (PersonService)ctx.getBean("personService");
System.out.println(personService1 == personService2);
}
2、prototype
当bean的作用域设置为prototype的时候,在每次请求bean的时候,Spring IOC容器都会创建一个新的Bean实例。
这是配置文件beans.xml
<bean id="personService" class="cn.itcast.service.impl.PersonServiceBean" scope="prototype">
</bean>
这是测试文件SpringTest.java:
public void instanceSpring() {最后的输出结果是: false 。证明这两个Bean实例不是同一个Bean。
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
PersonService personService1 = (PersonService)ctx.getBean("personService");
PersonService personService2 = (PersonService)ctx.getBean("personService");
System.out.println(personService1 == personService2);
}