spring 源码探索--创建bean实例和初始化

来源:互联网 发布:殷叶子演过的网络剧 编辑:程序博客网 时间:2024/06/18 12:32

创建bean

1.创建bean实例 createBeanInstance 使用各种实例化策略
2.将创建bean实例的工厂加入到缓存当中,用来检测循环依赖。在之前的《单例bean解析循环依赖》里面有详细介绍。

注入bean的依赖

populateBean

初始化bean.

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.class

populateBean处理完bean的依赖之后,开始执行 initializeBean,
执行的流程:
1. 执行实现了BeanFactoryAware,BeanNameAware接口的方法setBeanFactory
2. 执行接口BeanPostProcessor的postProcessBeforeInitialization 初始化预处理方法
3. 再调用实现InitializingBean接口的afterPropertiesSet方法,自定义初始化方法init-method(xml中定义)
4. 执行接口BeanPostProcessor的postProcessAfterInitialization

在spring容器中,一般都是从容器中获取实例bean,如果想让bean获得spring的引用,那么就得使用ApplicationContextAware接口。让bean实现这个接口,实现setApplicationContext方法

private ApplicationContext context;public void setApplicationContext(ApplicationContext context){    this.context = context;}

这个setApplicationContext方法是spring容器自动触发的,触发的时机是在什么时候呢?第一眼看到的时候,我也这样问自己。现在有答案了。

就是在postProcessBeforeInitialization这个阶段执行的。

要在这个阶段执行的实例,首先是需要注册了一个ApplicationContextAwareProcessor,
这个类继承了BeanPostProcessor
postProcessBeforeInitialization方法调用以下代码:

private void invokeAwareInterfaces(Object bean) {        if (bean instanceof Aware) {        ...........        if (bean instanceof ApplicationContextAware) {        ((ApplicationContextAware) bean).setApplicationContext(this.applicationContext);            }        }    }
beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));

上面的代码是在AbstractBeanFactory中的refresh中的prepareBeanFactory方法中执行的。

0 0