Spring(6) bean的scope属性

  1. 在配置bean的时候,如果不指定scope属性的话,spring默认采用singleton,也就是单例模式创建实例的。这样不管请求多少次id,都只会创建一个实例而已。只有当显示指定scope属性为prototype的时候,才会一次请求就产生一个实例。
  2. 下面是实例代码,程序结构Spring(6) bean的scope属性
  3. <?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.xsd">
        <!--配置一个singleton-->
        <bean id="p1" class="service.Person"/>
        <!--配置一个prototype实例-->
        <bean id="p2" class="service.Person" scope="prototype"/>
        <bean id="date" class="java.util.Date"/>
    </beans>
    package service;
    
    
    public class Person{
    
    }
    
    package main;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class BeanTest {
        public static void main(String []args) throws Exception{
    //        通过例子可以看到,如果不指定scope属性的话,默认是使用singleton,也就是单例模式来创建实例的
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans3.xml");
            System.out.println(applicationContext.getBean("p1") == applicationContext.getBean("p1"));
            System.out.println(applicationContext.getBean("p2") == applicationContext.getBean("p2"));
    
    //        尽管程序阻塞了一秒钟,但是输出的时间是一样的,因为spring只创建了一个date实例
            System.out.println(applicationContext.getBean("date"));
            Thread.sleep(1000);
            System.out.println(applicationContext.getBean("date"));
        }
    }
    //运行程序看到输出
    //        true
    //        false
    //        Sun Dec 02 13:50:11 CST 2018
    //        Sun Dec 02 13:50:11 CST 2018

    这是我看李刚编著的《轻量级javaEE企业应用实战(第五版)-Struts2+Spring5+Hibernate5/JAP2》后总结出来的。