Spring---Bean的作用域

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作用域。

猜你喜欢

转载自blog.csdn.net/dingse/article/details/79598838