从getSingleton方法开始:
sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() { @Override public Object getObject() throws BeansException { try { return createBean(beanName, mbd, args); } catch (BeansException ex) { // Explicitly remove instance from singleton cache: It might have been put there // eagerly by the creation process, to allow for circular reference resolution. // Also remove any beans that received a temporary reference to the bean. destroySingleton(beanName); throw ex; } } });
其中的createBean方法中就有bean的处理器。
beanPostProcess只是顶层处理器,相当于一个最基本的后置处理器它会贯穿所有spring的bean初始化时的阶段,会在initializationBean中调用。
实际上还有很多后置处理器的更多具体实现:
第一个方法:resolveBeforeInstantiation ,获取所有后置处理器,判断是否为InstantiationAwareBeanPostProcessor实现类型,调用的方法是:postProcessBeforeInstantiation
这个后置处理器很关键,InstantiationAwareBeanPostProcessor有3个方法,第一个方法postProcessBeforeInstantiation如果你直接返回一个“自建对象”的话,那spring上下文直接就会把你的这个对象放入容器中,并执行BeanPostProcessor的postProcessAfterInitialization方法。如果第一个方法返回为null,则spring创建bean的流程会继续执行,会在populateBean方法中继续调用postProcessAfterInstantiation和postProcessPropertyValues来进行属性的装配。
如果这里出现了aop的切面类,就会有InstantiationAwareBeanPostProcessor的子处理器进行类的过滤,出现@AspectJ的类标记为不需要代理的类,会被放入map中。
第二个方法:在createBeanInstance中的determineConstructorsFromBeanPostProcessors方法中,判断是否为SmartInstantiationAwareBeanPostProcessor类型的后置处理器,调用的方法是:determineCandidateConstructors,这个方法用来推断构造函数,实际使用的实现SmartInstantiationAwareBeanPostProcessor接口的AutowiredAnnotationBeanPostProcess后置处理器去做的。
第三个方法:在createBeanInstance中的applyMergedBeanDefinitionPostProcessors方法中,判断为MergedBeanDefinitionPostProcessor,调用的方法是:postProcessMergedBeanDefinition,用来缓存注解信息。
第四个方法:在createBeanInstance中的getEarlyBeanReference方法中,判断是否为SmartInstantiationAwareBeanPostProcessor,调用的方法是:getEarlyBeanReference
这个方法是来解决循环依赖问题的。这里很重要,要详细的分析
第五个方法:在populateBean中的会调用InstantiationAwareBeanPostProcessor这个处理器,调用的方法是:postProcessAfterInstantiation
第六个方法:在populateBean中的又会调用InstantiationAwareBeanPostProcessor这个处理器,但是调用的方法是postProcessPropertyValues
第七个方法:在initializationBean中调用的是BeanPostProcess的postProcessBeforInitialization方法
第八个方法:在initializationBean中调用的是BeanPostProcess的postProcessAfterInitialization方法
第九个是销毁时的方法