• 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的方法)时,才会执行手动销毁的方法。

     
  • 相关阅读:
    express实现前后端通信上传图片,存储数据库(mysql)傻瓜教程(二)
    express实现前后端通信上传图片,存储数据库(mysql)傻瓜教程(一)
    [转载] 在阿里做了五年技术主管,我有话想说
    阿里云RDS MySql还原到本地Linux/Centos
    如何领域驱动设计?-实践感悟&总结分享
    jira + confluence 安装和破解
    RabbitMQ安装和配置
    [转]技术路线的选择重要但不具有决定性
    .Net core2.0日志组件Log4net、Nlog简单性能测试
    在微服务中使用领域事件
  • 原文地址:https://www.cnblogs.com/ylblikestudyJava/p/12425784.html
Copyright © 2020-2023  润新知