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

创建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方法中执行的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值