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; }