• 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方法来执行销毁操作。
  • 相关阅读:
    九、springboot整合RabbitMq 用死信队列做延迟队列
    八、RabbitMq死信队列与延迟队列
    七、RabbitMq交换机
    六、RabbitMq 发布确认模式(confirm模式)
    五、RabbitMq的消息应答机制
    四、RabbitMq的工作模式( Work Queues)
    三、RabbitMq简单模式(hello world)
    qt 使用属性设置替换样式,为无setstylesheet接口的的action设置样式
    SpringBoot配置国际化
    基于策略模式的前端表单设计
  • 原文地址:https://www.cnblogs.com/juzhuxiaozhu/p/12814156.html
Copyright © 2020-2023  润新知