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