Spring启动过程中实例化前部分的分析

Spring启动过程中实例化前部分的分析

 

代码部分

  说明

    1.hasInstantiationAwareBeanPostProcessors()方法说明

        其实是判断  AbstractBeanFactory类的hasInstantiationAwareBeanPostProcessors中  是否标志有处理器( 5.3版本后其实是存放于BeanPostProcessorCache中,里面有四个List都是用于存放各种处理器的缓存,不用多做在意,因为5.3之后都是一次性全部遍历存完,优化了部分)

     2.applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) 方法说明

           该方法作用有两种,一种是修改对象实例元数据(因为还没被创建,所以元数据的改动会导致实例的改动),一种是提前返回Bean对象(可以返回自己定义的某个对象实例)

     3.applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) 方法说明

           该方法为初始化后的调用方法,为什么如果bean创建后要调用呢?  因为这个方法与AOP有关,在这个方法中进行AOP,是每个bean都要进行处理的方法,在这个方法内判断需不需要进行动态代理,不需要就返回本身,需要就进行动态代理。(具体可查看  Spring的AOP底层解析  )

  代码展示

protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
    Object bean = null;
    if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
        if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
            Class<?> targetType = determineTargetType(beanName, mbd);
            if (targetType != null) {
                bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
                if (bean != null) {
                    bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
                }
            }
        }
        mbd.beforeInstantiationResolved = (bean != null);
    }
    return bean;
}
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » Spring启动过程中实例化前部分的分析