Spring系列(三)

系列目录

IOC(三)

1. 单例与多例

Spring容器管理的Bean在默认的情况下是单例的,也即,一个bean只会创建一个对象,存在内置的map中,之后无论获取多少次该bean,都将返回同一个对象。

默认采用单例方式,减少了对象的创建,从而减少了内存的消耗。但是在实际开发中存在多例的需求,Spring 也提供了选项可以将 bean 设置为多例模式。

<bean scope="prototype"/>

  • bean在单例模式下的生命周期:
    bean 在单例模式下,Spring容器启动时解析xml发现该bean标签后,直接创建该bean的对象存入内部map中保存,
    此后无论调用多少次getBean()获取该bean都是从mao中获取该对象返回,一直是一个对象。
    此对象
    一直被Spring容器持有,随容器的退出被销毁。

  • bean在多例模式下的生命周期:
    bean在多利模式下,Spring容器启动时解析xml发现该bean标签后,只是将该bean进行管理,并不会创建对象
    此后每次使用getBean()获取该bean时,Spring都会重新创建该对象返回,每次都是一个新的对象。Spring容器
    不会持有该对象,什么时候销毁取决于使用该对象的用户。

2. 懒加载机制(延迟加载)

Spring默认会在容器初始化的过程中解析xml,并将单例的bean创建并保存到map中,一旦bean过多,Spring需要在启动的过程中花费大量的时间来创建bean,也会花费大量的空间存储bean,但这些bean可能很久都用不上,这种在启动时在时间和空间上的浪费显得非常的不值得。

针对这种情况,Spring提供了懒加载机制,即是可以规定指定的bean不在启动时立即创建,而是在后续第一次用到时才创建,从而减轻在启动过程中对时间和内存的消耗。

注意:懒加载机制只对单例bean有作用,对于多例bean没有意义。懒加载只是延后了对象创建的时机,对象仍然是单例的。

//为指定类配置懒加载
<bean lazy-init="true"/>

//为全局配置懒加载
<beans ... default-lazy-init="true"></beans>

如果同时设定全局和指定bean的懒加载机制,且配置不相同,则对于该 bean 局部配置覆盖全局配置。

3. 配置初始化和销毁的方法

在Spring中如果某个bean在初始化之后或销毁之前要做一些额外操作,则可以为该bean配置初始化和销毁的方法。

public class Son {
    public Son(){
        System.out.println("唔被创建了");
    }
    public void init(){
        System.out.println("唔出生了");
    }
    public void destory(){
        System.out.println("唔挂了");
    }
}


 /**
     * 测试初始化和销毁方法
     */

    @Test
    public void test03(){
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext3.xml");
        Son s = context.getBean(Son.class);
        ((ConfigurableApplicationContext)context).close();

    }

<bean id="son" class="cn.work.domain.Son" init-method="init" destroy-method="destory"/>

Spring中关键方法执行顺序:

  1. 在Spring创建bean对象时,先创建对象(通过无参构造或工厂)。
  2. 立即调用init方法来执行初始化操作。
  3. 调用其它普通方法。
  4. 对象销毁之前,spring容器调用其destory方法来执行销毁操作。
posted @ 2020-05-01 17:45  仰观云  阅读(18)  评论(0编辑  收藏
Live2D