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

 

 

posted @ 2020-03-06 12:43  我的二天  阅读(763)  评论(0编辑  收藏  举报