spring的9个地方调用了5次后置处理器的详细情况

从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方法

第九个是销毁时的方法

原文地址:https://www.cnblogs.com/zzq-include/p/12228461.html