春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(“获取完毕豆:“+咖啡); }运行结果如下:
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(“获取完毕豆:“+咖啡); }运行结果如下:
<强>二,原理分析强>
春启动时主要干俩件事,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原理是什么