zoukankan      html  css  js  c++  java
  • spring学习笔记__spring的单例多例模式

    Singleton: 在一个spring容器中,对象只有一个实例。(默认值

    Prototype: 在一个spring容器中,存在多个实例,每次getBean 返回一个新的实例

    //创建类SingletonBean .java类
    public class SingletonBean {
        public SingletonBean() {
            System.out.println("SingletonBean:初始化了单例");
        }
    }
    
    //创建类PrototypeBean.java类
    //多例bean
    public class PrototypeBean {
        public PrototypeBean() {
            System.out.println("--PrototypeBean初始化了多例的");
        }
    }

    定义spring容器,applicationContext.xml:

     <!-- 
            bean的作用范围
            scope:配置作用范围的,默认值就是singleton单例
         -->
        <!-- 单例 -->
        <!-- <bean id="singletonBean" class="com.igeek.scope.SingletonBean" scope="singleton"/> -->
        <bean id="singletonBean" class="com.igeek.scope.SingletonBean"/>
        <!-- 多例 -->
        <bean id="prototypeBean" class="com.igeek.scope.PrototypeBean" scope="prototype"/>

    创建测试:

    public class SpringTest {
        
        @Test
        public void testScope(){
            //先构建实例化获取spring的容器(工厂、上下文)
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
            //目标1:看看多次获取bean的时候,是不是同一个
            //目标2:看看bean什么时候初始化的
            //获取单例的bean:应该是同一个
            //单例:每次从spring容器中获取的对象,是同一个对象
            //单例初始化:是在spring容器初始化的时候,就初始化了
            SingletonBean singletonBean1=(SingletonBean)applicationContext.getBean("singletonBean");
            SingletonBean singletonBean2=(SingletonBean)applicationContext.getBean("singletonBean");
            System.out.println(singletonBean1);
            System.out.println(singletonBean2);
            //获取多例的bean:
            //多例:每次从spring容器中获取的对象,不是同一个对象
            //多例初始化:是在getBean的时候初始化,相当于每次getbean就是在new Bean()
            PrototypeBean prototypeBean1=(PrototypeBean)applicationContext.getBean("prototypeBean");
            PrototypeBean prototypeBean2=(PrototypeBean)applicationContext.getBean("prototypeBean");
            System.out.println(prototypeBean1);
            System.out.println(prototypeBean2);
            
        }
    
    }

    效果如下:

     总结:单例是默认创建的,不写是默认单例模式,而要创建多例模式,要标注bean中的属性scope="prototype"

    多例初始化:是在getBean的时候初始化,相当于每次getbean就是在new Bean()
    单例初始化:是在spring容器初始化的时候,就初始化了
    bean有生命周期:init-method="初始化方法名" destroy-method="销毁方法名"
    <!-- 生命周期调用的两个方法 
        init-method:初始化时(后)调用的,bean中的共有方法即可
        destroy-method:销毁时(前)被调用的。
        -->
        <bean id="lifeCycleBean" class="com.igeek.xmllifecycle.LifeCycleBean" init-method="init" destroy-method="destroy" scope="singleton"/>
    
    

    销毁方法的执行必须满足两个条件:

    1) 单例(singleton)的bean才会可以手动销毁。

    2) 必须手动关闭容器(调用close的方法)时,才会执行手动销毁的方法。

     
  • 相关阅读:
    Linux:CentOS-7配置VMware-15.5与本机IP同网段
    SpringCloud:Zuul路由配置超时问题
    SpringCloud:路由ZUUL的配置详解
    SpringCloud:扩展zuul配置路由访问
    给source insight添加.cc的C++文件后缀识别(转载)
    Linux下共享库嵌套依赖问题 (转载)
    Ubuntu 下编译libjingle-0.6.14 (转载)
    什么是「穷人思维」?
    谁上北大是能力说了算,不该是教育部(转载)
    Installing cmake 2.8.8 or higher on Ubuntu 12.04 (Precise Pangolin) (转载)
  • 原文地址:https://www.cnblogs.com/ylblikestudyJava/p/12425784.html
Copyright © 2011-2022 走看看