返回介绍

5.5.2 实例化的前置处理

发布于 2025-04-22 22:09:10 字数 2902 浏览 0 评论 0 收藏

在真正调用 doCreate 方法创建 bean 的实例前使用了这样一个方法 resolveBeforeInstantiation (beanName, mbd) 对 BeanDefinigiton 中的属性做些前置处理。当然,无论其中是否有相应的逻辑实现我们都可以理解,因为真正逻辑实现前后留有处理函数也是可扩展的一种体现,但是,这并不是最重要的,在函数中还提供了一个短路判断,这才是最为关键的部分。

if (bean != null) {

  return bean;

}

当经过前置处理后返回的结果如果不为空,那么会直接略过后续的 Bean 的创建而直接返回结果。这一特性虽然很容易被忽略,但是却起着至关重要的作用,我们熟知的 AOP 功能就是基于这里的判断的。

protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {

  Object bean = null;

//如果尚未被解析

  if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {

   // Make sure bean class is actually resolved at this point.

   if (mbd.hasBeanClass() && !mbd.isSynthetic() && hasInstantiationAware

   BeanPostProcessors()) {

    bean = applyBeanPostProcessorsBeforeInstantiation(mbd.getBeanClass(),

   beanName);

     if (bean != null) {

     bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);

   }

  }

   mbd.beforeInstantiationResolved = (bean != null);

 }

  return bean;

}

此方法中最吸引我们的无疑是两个方法 applyBeanPostProcessorsBeforeInstantiation 以及 applyBeanPostProcessorsAfterInitialization。两个方法实现的非常简单,无非是对后处理器中的所有 InstantiationAwareBeanPostProcessor 类型的后处理器进行 postProcessBeforeInstantiation 方法和 BeanPostProcessor 的 postProcessAfterInitialization 方法的调用。

1.实例化前的后处理器应用

bean 的实例化前调用,也就是将 AbsractBeanDefinition 转换为 BeanWrapper 前的处理。给子类一个修改 BeanDefinition 的机会,也就是说当程序经过这个方法后,bean 可能已经不是我们认为的 bean 了,而是或许成为了一个经过处理的代理 bean,可能是通过 cglib 生成的,也可能是通过其它技术生成的。这在第 7 章中会详细介绍,我们只需要知道,在 bean 的实例化前会调用后处理器的方法进行处理。

protected Object applyBeanPostProcessorsBeforeInstantiation(Class beanClass, String beanName)

throws BeansException {

  for (BeanPostProcessor bp : getBeanPostProcessors()) {

   if (bp instanceof InstantiationAwareBeanPostProcessor) {

    InstantiationAwareBeanPostProcessor ibp = (Instantiation AwareBean

    PostProcessor) bp;

    Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);

    if (result != null) {

     return result;

   }

  }

 }

  return null;

}

2.实例化后的后处理器应用

在讲解从缓存中获取单例 bean 的时候就提到过,Spring 中的规则是在 bean 的初始化后尽可能保证将注册的后处理器的 postProcessAfterInitialization 方法应用到该 bean 中,因为如果返回的 bean 不为空,那么便不会再次经历普通 bean 的创建过程,所以只能在这里应用后处理器的 postProcessAfterInitialization 方法。

public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)

throws BeansException {

  Object result = existingBean;

  for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {

   result = beanProcessor.postProcessAfterInitialization(result, beanName);

   if (result == null) {

    return result;

  }

 }

  return result;

}

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。