Learn Spring - Bean Scope属性之singleton和prototype

Scope属性

Spring Bean配置中的Scope属性用于告诉Ioc容器创建Bean对象的范围,只能创建一个对象还是能够创建任意个对象。其值可以是singletonprototyperequestsessionglobal-sessionrequestsessionglobal-session只有在web应用中才有效。这里只讲prototypesingleton

singleton和prototype区别

singleton prototype
只能创建一个Bean实例,Ioc容器会对创建的实例进行缓存,下次请求创建时,返回缓存的实例 可以创建任意个实例
默认值 非默认值

Singleton

目录结构

singleton_dir_tree

Code

HelloSpring.java
package me.coolcodes;

public class HelloSpring {
    private String message;

    public void setMessage(String message){
        this.message  = message;
    }
    public void getMessage(){
        System.out.println("Your Message : " + message);
    }
}
Main.java
package me.coolcodes;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Main {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
        HelloSpring objA = (HelloSpring) context.getBean("helloSpring");

        objA.setMessage("I am objA");
        objA.getMessage();

        HelloSpring objB = (HelloSpring) context.getBean("helloSpring");
        objB.getMessage();
    }
}

先通过getBean()创建一个objA,设置messageI am objA。然后再通过getBean()创建一个objB。如果objAobjB是不同的对象,最后输出应该是I am objA \n Hello World!。反之,如果是同一个对象,最后输出应该是I am objA \n I am objA

Beans.xml

设置scopesingleton

<?xml version = "1.0" encoding = "UTF-8"?>

<beans xmlns = "http://www.springframework.org/schema/beans"
       xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation = "http://www.springframework.org/schema/beans
   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

    <bean id = "helloSpring" class = "me.coolcodes.HelloSpring" scope="singleton">
        <property name = "message" value = "Hello World!"/>
    </bean>

</beans>
结果

singleton_result

从结果可以看出,objAobjB是同一个对象。

Prototype

只需要将Beans.xmlscope的值改为prototype

结果

prototype_result

从结果可以看出,objAobjB是不同的对象。

comments powered by Disqus