Spring-BeanPostProcessor

BeanPostProcessor

BeanPostProcessor是spring的bean增强器,也就是说我们交给spring管理的那些类,在创建之后还可以对他进行增强,那是怎么用的呢,我们这篇文章就来看看

BeanPostProcessor源码

public interface BeanPostProcessor {
    // 前置处理(bean初始化方法前)
   @Nullable
   default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
      return bean;
   }
    // 后置处理(bean初始化方法后)
   @Nullable
   default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
      return bean;
   }
}

这两个方法说明了在bean的什么时候增强,一个是bean之前(Before),一个是bean之后(After),那到底是在什么时候在哪里调用的呢,这里就不得不提到我们去spring的工厂获取bean时的操作流程,当spring容器中有的话,就直接返回,也就是说已经被创建过了,并且放在spring容器中了。那么BeanPostProcessor是在创建的时候执行的,我们就看看创建的那个方法,主要看看创建bean的那几个步骤吧

AbstractAutowireCapableBeanFactory.doCreateBean

  1. 反射创建对象(创建出来的对象里面的属性都是默认的)
  2. 填充属性
  3. 初始化bean
public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory
		implements AutowireCapableBeanFactory {
    protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
          throws BeanCreationException {
       // Instantiate the bean.
       BeanWrapper instanceWrapper = null;
       if (mbd.isSingleton()) {
          instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
       }
       if (instanceWrapper == null) {
          /** 反射创建bean: BeanUtils.instantiateClass(constructorToUse); */
          instanceWrapper = createBeanInstance(beanName, mbd, args);
       }
	   Object bean = instanceWrapper.getWrappedInstance();
       // Initialize the bean instance.
       Object exposedObject = bean;
       try {
          /** 填充属性,依赖注入等 */
          populateBean(beanName, mbd, instanceWrapper);
          /** 初始化bean,设置调用Aware和调用beanPostProcessor处理bean */
          exposedObject = initializeBean(beanName, exposedObject, mbd);
       }
       catch (Throwable ex) {
       }
       return exposedObject;
    }
}

在这里并没有看到我们BeanPostProcessor所要执行的那几个方法,那么是在哪个步骤里面呢,1.反射创建对象是不可能的,他只是反射创建对象,2.填充属性也不是,所以就是在第3步的时候了:初始化bean

为什么是初始化bean,这里我们可以知道哈,当一个完整的bean创建出来之后,我们才可以对他进行增强吧,所以我们看看initializeBean()

public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory
		implements AutowireCapableBeanFactory {
    protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {
		if (System.getSecurityManager() != null) {
			AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
				invokeAwareMethods(beanName, bean);
				return null;
			}, getAccessControlContext());
		}
		else {
            // 如果bean实现了某些Aware,这里就会调用对应的setXXX方法
			invokeAwareMethods(beanName, bean);
		}

		Object wrappedBean = bean;
		if (mbd == null || !mbd.isSynthetic()) {
            // 执行BeanPostProcessors的前置处理
			wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
		}

		try {
            // 执行bean的初始化方法
			invokeInitMethods(beanName, wrappedBean, mbd);
		}
		catch (Throwable ex) {
			throw new BeanCreationException(
					(mbd != null ? mbd.getResourceDescription() : null),
					beanName, "Invocation of init method failed", ex);
		}
		if (mbd == null || !mbd.isSynthetic()) {
            // 执行BeanPostProcessors的后置处理
			wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
		}

		return wrappedBean;
	}
}

这个方法有很多步骤要执行

  1. 先是把一些Aware写到bean去(如果实现了某些Aware接口的话): invokeAwareMethods(beanName, bean);
  2. 接下来就是到applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName); 眼不眼熟,就是我们要讲的BeanPostProcessors的BeforeInitialization吧
  3. 然后就是invokeInitMethods(beanName, wrappedBean, mbd); 执行初始化方法
  4. 最后就是applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName); 也是很眼熟吧,BeanPostProcessors的AfterInitialization

我们本篇主要讲的是BeanPostProcessors,所以我们就看看applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);和applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);

public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory
		implements AutowireCapableBeanFactory {
    @Override
	public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName)
			throws BeansException {

		Object result = existingBean;
        // 遍历BeanPostProcessor们执行他的前置处理方法
		for (BeanPostProcessor processor : getBeanPostProcessors()) {
            // 如果前置处理返回的是null,就返回原先的bean,否则返回前置处理返回的
			Object current = processor.postProcessBeforeInitialization(result, beanName);
			if (current == null) {
				return result;
			}
			result = current;
		}
		return result;
	}

	@Override
	public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
			throws BeansException {

		Object result = existingBean;
        // 遍历BeanPostProcessor们执行他的后置处理方法
		for (BeanPostProcessor processor : getBeanPostProcessors()) {
            // 如果前置处理返回的是null,就返回原先的bean,否则返回前置处理返回的
			Object current = processor.postProcessAfterInitialization(result, beanName);
			if (current == null) {
				return result;
			}
			result = current;
		}
		return result;
	}
}

主要就是获取到BeanPostProcessor列表们,然后逐个调用他们的方法

BeanPostProcessor何时添加到列表中

在刷新spring上下文的时候调用了一个registerBeanPostProcessors(beanFactory);方法,这个方法就是将我们定义的BeanPostProcessor添加到他的列表中去,然后在我们上面所说的地方去取出来逐个调用执行

总结

BeanPostProcessor是在创建bean的时候执行的,具体的说是在bean执行初始化方法的前后执行的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值