Spring框架学习---Spring的IoC高级特性之lazy-Init 延迟加载

Spring框架学习—Spring的IoC之高级特性

lazy-Init 延迟加载,指的是bean对象的延迟加载

在这里插入图片描述
当然,这里在刚启动容器就实例化bean对象,之后是从缓存中取出来的bean对象,懒加载指的是当我们getBean的时候才会获取bean对象的,有一点需要注意lazy-Init 延迟加载只适用于单例机制,不适用于多例,而且默认是false

  1. 当没配置lazy-Init 延迟加载机制的时候,表示⽴即加载,表示在spring启动时,⽴刻进⾏实例化。
    <bean id="testBean" class="cn.lagou.LazyBean" />
    //该bean默认的设置为:
     <bean id="testBean" calss="cn.lagou.LazyBean" lazy-init="false" />
    
    ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringConfig.class);
    AccountDao accountDao = (AccountDao) applicationContext.getBean("testBean");
    System.out.println(accountDao);
    
  2. 查看applicationContext中有个beanFactory,里面有个单例池singletonObjects,里面放置了bean对象testBean
  3. 当配置lazy-Init 延迟加载机制的时候,只有执行getBean操作的时候才会创建bean对象,
    目的:如果不想让⼀个singleton bean 在 ApplicationContext实现初始化时被提前实例化,那么可以将bean设置为延迟实例化。
    <bean id="testBean" calss="cn.lagou.LazyBean" lazy-init="true" />
    
  4. 如果⼀个设置了⽴即加载的 bean1,引⽤了⼀个延迟加载的 bean2 ,那么 bean1 在容器启动时被实例
    化,⽽ bean2 由于被 bean1 引⽤,所以也被实例化,这种情况也符合延时加载的 bean 在第⼀次调⽤
    时才被实例化的规则。
    也可以在容器层次中通过在 元素上使⽤ “default-lazy-init” 属性来控制延时初始化。如下⾯配置:
    <beans default-lazy-init="true">
    <!-- no beans will be eagerly pre-instantiated... -->
    </beans>
    
  5. 如果⼀个 bean 的 scope 属性为 scope=“pototype” 时,即使设置了 lazy-init=“false”,容器启动时也不会实例化bean,⽽是调⽤ getBean ⽅法实例化的。
  6. 使用注解@Lazy也可以达到延迟加载的效果

应⽤场景

  1. 开启延迟加载⼀定程度提⾼容器启动和运转性能
  2. 对于不常使⽤的 Bean 设置延迟加载,这样偶尔使⽤的时候再加载,不必要从⼀开始该 Bean 就占⽤资源

你可能感兴趣的:(spring)