概述
- 定义所有beanDefinitions
- 遍历这些beanDefinitions,创建bean,整个过程在doCreateBean()中
- 创建bean过程:先new对象,再注入属性,最后调用初始化方法(后处理器等)
详细过程
- BeanDefinition载入、解析、注册
1、找到配置文件Resource。
2、将配置文件解析成BeanDefinition
3、将BeanDefinition向Map中注册 Map<name,beandefinition>
通过上述三个步骤我们将配置在配置文件中的<bean/>节点,全部封装到上述的Map<name,beandefinition>中。为后续的getBean()打下了基础。
这个过程大概可以理解为,
1:找到原材料
2:把原材料装进容器里 - bean的实例化和依赖注入
此过程由getBean()方法触发
image.png
image.png
创造 bean
image.png
完成 创建bean
image.png
最终创建bean, 根据bean定义,同时生成了注入属性,但值为null,还没注入属性对象。
image.png
填充属性,实现依赖注入,bean中的依赖bean是在这里注入的!
image.png
此过程根据上述的BeanDefition,
1:通过反射或者Cglib的方式创造bean
2:根据配置的依赖将所需要的bean注入进来,此过程会递归调用getBean()方法。
3:根据bean的scope决定是否缓存该Bean,一般情况为单例。容器会缓存该对象。
这个过程大概可以理解为
将原材料进行加工,创造可以直接利用的产品。
到此,spring容器就可以对外提供服务了。
bean注入属性bean过程
-
填充bean属性
image.png -
使用后处理器填充属性,这里会有多个后处理器,填充多种不同的属性。
AbstractAutowireCapableBeanFactory.populateBean()
image.png
多个填充属性后处理器
image.png
- 注解方式注入bean地方,终于找到了!
CommonAnnotationBeanPostProcessor.postProcessPropertyValues()
image.png
- xml方式注入bean地方,这里的属性都是xml里面配置的 property。
CommonAnnotationBeanPostProcessor.postProcessPropertyValues()
image.png
调用初始化方法过程
创建对象时一共有四个地方可以让我们操作这个对象。
image.png
-
首先调用织入方法
织入方法会根据类型调对应方法。
所以实现了对应接口就能获取到对应的对象了。
image.png 调用初始化前后处理器
实现了这个接口,就能够被调用到了。
注意:所有bean都会调用这个后处理器,如果有多个后处理器,都会被调用,又饿order属性,可以控制这些后处理器的调用顺序。
public interface BeanPostProcessor {
Object postProcessBeforeInitialization(Object var1, String var2) throws BeansException;
Object postProcessAfterInitialization(Object var1, String var2) throws BeansException;
}
- 调初始化方法
这里后先调用InitializingBean的afterPropertiesSet方法。
再调我们自己配置的init方法,比如这样。
<bean class="com.ymm.trade.es.utils.MyBeanPostProcessor" init-method="init"/>
image.png
- 调初始化后的后处理器
和第2步一样。