一、介绍scope
在使用IoC容器创建Bean对象时,如果我们创建一个单例的bean,则所有对它的请求都会返回相同的对象。
实例:
Test.java
public class Test {
public static void main(String[] args) {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("application.xml");//创建IoC容器,并加载配置文件
Object object = applicationContext.getBean("userInfo");
System.out.println(object);//输出1
object = applicationContext.getBean("userInfo");//再次获取UserInfo对象
System.out.println(object);//输出2
applicationContext.close();
}
}
执行结果为:
可见返回了两个相同的对象地址。
此时若添加scope标签并赋"prototype"属性,则会在每次调用Bean对象时每次对它的访问都会返回一个新的对象。
scope配置:
1)xml方式
在xml配置文件中,进行bean配置时,增添scope="prototype"属性
application.xml
<bean id="userInfo" class="com.jd.vo.UserInfo" scope="prototype"/>
2)注解方式
在目标类上添加@Scope注解并配置
@Scope("prototope")
public class Test {
public static void main(String[] args) {
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("application.xml");
Object object = applicationContext.getBean("userInfo");
System.out.println(object);
applicationContext.close();
}
}
使用scope后,Test.java运行结果为:
两次对象地址不同。
二、scope的不同属性
1、singleton(scope标签默认属性)
仅创建单一实例,此取值时表明容器中创建bean对象时只存在一个实例,因此所有引用此bean都是单一实例。此外,singleton类型的bean定义从容器启动到第一次被请求而实例化开始,只要容器不销毁或退出,该类型的bean的单一实例就会一直存活
2、 prototype
创建多个对象,spring容器在进行输出prototype的bean对象时,会每次都重新生成一个新的对象给请求方。
注意:虽然这种类型的对象的实例化以及属性设置等工作都是由容器负责的,但是只要准备完毕,并且对象实例返回给请求方之后,容器就不在拥有当前对象的引用,请求方需要自己负责当前对象后继生命周期的管理工作,包括该对象的销毁。也就是说,容器每次返回请求方该对象的一个新的实例之后,就由这个对象“自生自灭”
3、session
同一个session请求中仅提供一个对象
4、request
同一个request请求中仅提供一个对象