spring源码中doCreateBean创建bean时使用的PostProcessor说明

bean实例化是使用的PostProcessor
        //执行创建bean
        doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
            //创建bean实例(FactionBean、有参构造、无参构造)
            createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
                //遍历PostProcessors类型为:SmartInstantiationAwareBeanPostProcessor 的实例,该方法是获取所有@Autowire构造方法的
                determineConstructorsFromBeanPostProcessors(beanClass, beanName); 
                    SmartInstantiationAwareBeanPostProcessor.determineCandidateConstructors()。实际调用的是AutowiredAnnotationBeanPostProcessor.determineCandidateConstructors()
                    AutowiredAnnotationBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter
                        InstantiationAwareBeanPostProcessorAdapter implements SmartInstantiationAwareBeanPostProcessor
            //遍历PostProcessors类型为:MergedBeanDefinitionPostProcessor 收集类中的注解标签.缓存到容器中
            applyMergedBeanDefinitionPostProcessors(RootBeanDefinition mbd, Class beanType, String beanName)    
                MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class beanType, String beanName)
                所以调用的是AutowiredAnnotationBeanPostProcessor、InitDestroyAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor.postProcessMergedBeanDefinition
                    AutowiredAnnotationBeanPostProcessor implements MergedBeanDefinitionPostProcessor, PriorityOrdered, BeanFactoryAware
                        把注解@Autowired@Value标记的属性和方法,封装为:AutowiredMethodElement 
                        AutowiredMethodElement extends InjectionMetadata.InjectedElement
                        
                    CommonAnnotationBeanPostProcessor extends InitDestroyAnnotationBeanPostProcessor ;
                        把注解Resource.class元素属性和方法封装为:ResourceElement
                        public CommonAnnotationBeanPostProcessor() {
                            setOrder(Ordered.LOWEST_PRECEDENCE - 3);
                            setInitAnnotationType(PostConstruct.class);
                            setDestroyAnnotationType(PreDestroy.class);
                            ignoreResourceType("javax.xml.ws.WebServiceContext");
                        }
                        ResourceElement extends LookupElement
                            LookupElement extends InjectionMetadata.InjectedElement
                        super().postProcessMergedBeanDefinition封装初始化完成执行的方法@PostConstruct、销毁前@PreDestroy解析封装到LifecycleMetadata中并缓存                            
                        InitDestroyAnnotationBeanPostProcessor implements DestructionAwareBeanPostProcessor, MergedBeanDefinitionPostProcessor, PriorityOrdered, Serializable
            //往三级缓存中添加实例
            addSingletonFactory
                //放入实例到三级缓存中
                getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean)
                    //如果需要对bean做修改,可以在这里返回bean的时候动手脚,AOP的时候这里就可以代理bean
                    SmartInstantiationAwareBeanPostProcessor.getEarlyBeanReference(exposedObject, beanName);
            //IOC容器DI的实现
            populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw)
                //遍历PostProcessors类型为:InstantiationAwareBeanPostProcessor是否依需要依赖注入DI 如果返回false 则会导致不能依赖注入,慎用,如果使用条件一定要控制好
                InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation(Object bean, String beanName)
                //遍历PostProcessors类型为:InstantiationAwareBeanPostProcessor获取之前收集到的:InjectedElement,循环解析InjectedElement中的属性和方法,如果是引用类型调用getBean获取引用实例
                InstantiationAwareBeanPostProcessor.postProcessProperties(PropertyValues pvs, Object bean, String beanName)老版本5.0之前postProcessPropertyValues
                    AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor
            //创建完成bean实例后做的处理
            initializeBean(final String beanName, final Object bean, @Nullable RootBeanDefinition mbd)
                //执行需要初始化方法(invokeInitMethods)之前可以做的事情
                applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
                    //这里遍历所有BeanPostProcessor调用postProcessBeforeInitialization
                    BeanPostProcessor.postProcessBeforeInitialization(Object bean, String beanName)
                    InitDestroyAnnotationBeanPostProcessor  @PostConstruct注解方法的调用
                    ApplicationContextAwareProcessor  对某个Aware接口方法的调用
                
                //执行需要调用的初始化方法(InitializingBean接口,afterPropertiesSet,init-method属性)
                invokeInitMethods(beanName, wrappedBean, mbd);
                //执行初始化方法之后做的事情
                applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
                    //这里遍历所有BeanPostProcessor。对Bean实例化完成后,可以对bean的操作。AOP的住入口
                    BeanPostProcessor.postProcessAfterInitialization(result, beanName)
            
            //注册容器销毁时需要执行的方法到disposableBeans容器中
            registerDisposableBeanIfNecessary(String beanName, Object bean, RootBeanDefinition mbd)
                DestructionAwareBeanPostProcessor.requiresDestruction(Object bean)

你可能感兴趣的:(spring)