春天lazy-init原理是什么

  

春lazy-init原理是什么?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!

普通的bean的初始化是在容器启动初始化阶段执行的,而被lazy-init修饰的bean则是在从容器里第一次进行context.getBean(" ")时进行触发.Spring启动的时候会把所有豆信息(包括XML和注解)解析转化成春天能够识别的BeanDefinition并存到Hashmap里供下面的初始化时用。接下来对每个BeanDefinition进行处理,如果是懒加载的则在容器初始化阶段不处理,其他的则在容器初始化阶段进行初始化并依赖注入。

本文我说了很多次<强>春容器初始化和<强>豆初始化,强容器的初始化有可能包括bean的初始化主要取决于该bean是否是懒加载的,特此说明怕误会…:)

<强>一。先睹为快

话不多说先写个例子看下这属性到底有什么作用,我们定义了一个叫做咖啡的普通豆,代码如下:

1。普通非懒加载bean的演示

包com.test.spring;      公共类咖啡{      公众咖啡(){   System.out.println(“正在初始化bean ! ! !调用无参构造函数“);   }      }
  @Test
  公共空间testLazyInit () {
  
  System.out.println(“开始初始化春容器“);//非懒加载的bean会在容器初始化时进行bean的初始化,后面会拿春天启动时的源码进行分析
  ApplicationContext上下文=new ClassPathXmlApplicationContext (“spring-beans.xml");//非懒加载的bean的构造函数会在这个位置打印
  System.out.println(“春容器初始化完毕“);
  
  System.out.println(“开始从容器中获取Bean");
  
  咖啡咖啡=context.getBean (“coffee" Coffee.class);
  
  System.out.println(“获取完毕豆:“+咖啡);
  }

运行结果如下:

春天lazy-init原理是什么

2。非懒加载bean的演示

& lt; bean name=癱offee"类=癱om.test.spring.Coffee"lazy-init=皌rue"/在 @Test   公共空间testLazyInit () {      System.out.println(“开始初始化春容器“);//在初始化容器阶段不会对懒加载的bean进行初始化   ApplicationContext上下文=new ClassPathXmlApplicationContext (“spring-beans.xml");      System.out.println(“春容器初始化完毕“);      System.out.println(“开始从容器中获取Bean");//在这一阶段会对懒加载的bean进行初始化   咖啡咖啡=context.getBean (“coffee" Coffee.class);      System.out.println(“获取完毕豆:“+咖啡);         }

运行结果如下:

春天lazy-init原理是什么

<强>二,原理分析

春启动时主要干俩件事,1。初始化容器2。对豆进行初始化并依赖注入。(懒加载的bean不做第二件)

但是对于大多数bean来说,bean的初始化以及依赖注入就是在容器初始化阶段进行的,只有懒加载的bean是当应用程序第一次进行getBean时进行初始化并依赖注入。下面贴出代码看下

春容器初始化代码如下就一行:

ApplicationContext上下文=new ClassPathXmlApplicationContext (“spring-beans.xml"); 公共ClassPathXmlApplicationContext (String [] configLocations,布尔刷新,ApplicationContext父)   抛出BeansException {      超级(父);   setConfigLocations (configLocations);   如果(刷新){//Spring ioc启动入口了解了就刷新了解了国际奥委会   refresh ();   }   }

春初始化入口刷新(省略了部分根本次无关的代码,望理解,太长了影响阅读体验)

公共空refresh()抛出BeansException IllegalStateException {   同步(this.startupShutdownMonitor) {//这里准备让人耳目一新。   prepareRefresh ();//准备bean工厂在这种情况下使用。   prepareBeanFactory (beanFactory);      尝试{//允许后处理上下文bean工厂的子类。   postProcessBeanFactory (beanFactory);//调用工厂处理器注册为bean中。   invokeBeanFactoryPostProcessors (beanFactory);//注册豆处理器拦截bean创建。   registerBeanPostProcessors (beanFactory);//实例化所有剩余(non-lazy-init)单件。//初始化所有非懒加载的豆! ! ! !   finishBeanFactoryInitialization (beanFactory);//最后一步:发布对应的事件。   finishRefresh ();   }   }

春天lazy-init原理是什么