Spring源码之BeanPostProcessor的方法何时调用

通过前面的章节我们知道Bean的创建在doCreateBean中是怎么完成的。

首先,通过createBeanInstance对Bean进行实例化
然后,通过populateBean方法完成依赖注入

而BeanPostProcessor也就是Bean的后置处理,是在完成依赖注入后,通过initializeBean方法调用进行的。

后置:指的是在Bean实例化后,BeanPostProcessor都是在createBeanInstance对Bean进行实例化后执行的

        try {
    
    
            this.populateBean(beanName, mbd, instanceWrapper);
            exposedObject = this.initializeBean(beanName, exposedObject, mbd);
        } catch (Throwable var18) {
    
    
            if (var18 instanceof BeanCreationException && beanName.equals(((BeanCreationException)var18).getBeanName())) {
    
    
                throw (BeanCreationException)var18;
            }

            throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Initialization of bean failed", var18);
        }

initializeBean方法中
调用了applyBeanPostProcessorsBeforeInitialization处理Bean初始化前的处理
调用了invokeInitMethods执行初始化方法
调用了applyBeanPostProcessorsAfterInitialization处理Bean初始化后的处理

    protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {
    
    
        if (System.getSecurityManager() != null) {
    
    
            AccessController.doPrivileged(() -> {
    
    
                this.invokeAwareMethods(beanName, bean);
                return null;
            }, this.getAccessControlContext());
        } else {
    
    
            this.invokeAwareMethods(beanName, bean);
        }

        Object wrappedBean = bean;
        if (mbd == null || !mbd.isSynthetic()) {
    
    
            wrappedBean = this.applyBeanPostProcessorsBeforeInitialization(bean, beanName);
        }

        try {
    
    
            this.invokeInitMethods(beanName, wrappedBean, mbd);
        } catch (Throwable var6) {
    
    
            throw new BeanCreationException(mbd != null ? mbd.getResourceDescription() : null, beanName, "Invocation of init method failed", var6);
        }

        if (mbd == null || !mbd.isSynthetic()) {
    
    
            wrappedBean = this.applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
        }

        return wrappedBean;
    }

applyBeanPostProcessorsBeforeInitialization方法中,调用了BeanPostProcessor的postProcessBeforeInitialization方法,该方法在Bean的初始化前执行

    public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName) throws BeansException {
    
    
        Object result = existingBean;

        Object current;
        for(Iterator var4 = this.getBeanPostProcessors().iterator(); var4.hasNext(); result = current) {
    
    
            BeanPostProcessor processor = (BeanPostProcessor)var4.next();
            current = processor.postProcessBeforeInitialization(result, beanName);
            if (current == null) {
    
    
                return result;
            }
        }

        return result;
    }

applyBeanPostProcessorsAfterInitialization方法中,调用了BeanPostProcessor的postProcessAfterInitialization方法,该方法在Bean的初始化后执行

    public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) throws BeansException {
    
    
        Object result = existingBean;

        Object current;
        for(Iterator var4 = this.getBeanPostProcessors().iterator(); var4.hasNext(); result = current) {
    
    
            BeanPostProcessor processor = (BeanPostProcessor)var4.next();
            current = processor.postProcessAfterInitialization(result, beanName);
            if (current == null) {
    
    
                return result;
            }
        }

        return result;
    }

猜你喜欢

转载自blog.csdn.net/weixin_43073775/article/details/117881754