前言
普通的bean的初始化是在容器启动初始化阶段执行的,而被lazy-init修饰的bean则是在从容器里第一次进context.getBean(“”)时进行触发。 Spring启动的时候会把所有bean信息(包括XML和注解)解析转化成Spring能够识别的BeanDefinition并存到Hashmap里供下面的初始化时用。
接下来对每个BeanDefinition进行处理,如果是懒加载的则在容器初始化阶段不处理,其他的则在容器初始化阶段进行初始化并依赖注入。
本文我说了很多次 Spring 容器初始化和bean初始化,一键获取spring源码相关知识点(含面试题)
容器的初始化有可能包括bean的初始化主要取决于该bean是否是懒加载的。
一、先睹为快
话不多说先写个例子看下这属性到底有什么作用,我们定义了一个叫做coffee的普通bean,代码如下:
1.普通非懒加载bean的演示
package com.test.spring;
public class Coffee {
public Coffee() {
System.out.println("正在初始化bean !!!调用无参构造函数");
}
}
<bean name="coffee" class="com.test.spring.Coffee"/>
@Test
public void testLazyInit() {
System.out.println("开始初始化Spring容器 ");
// 非懒加载的bean会在容器初始化时进行bean的初始化,后面会拿Spring启动时的源码进行分析
ApplicationContext context = new ClassPathXmlApplicationContext("spring-beans.xml");
// 非懒加载的bean 的构造函数会在这个位置打印
System.out.println("Spring容器初始化完毕");
System.out.println("开始从容器中获取Bean");
Coffee coffee = context.getBean("coffee", Coffee.class);
System.out.println("获取完毕 bean :" + coffee);
}
运行结果如下: