如何判断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.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {

    Class<?> targetType = determineTargetType(beanName, mbd);

    if (targetType != null) {

     bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);

     if (bean != null) {

      bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);

     }

    }

   }

   mbd.beforeInstantiationResolved = (bean != null);

  }

  return bean;

 }

AbstractAutowireCapableBeanFactory 类中的 resolveBeforeInstantiation 方法来判断 bean 是用AOP代理生成代理对象,还是用反射生成实例。volatile Boolean beforeInstantiationResolved; 是RootBeanDefinition中的一个volatile变量。private boolean synthetic = false; 是 AbstractBeanDefintion 中的一个变量。这个变量的初始化是在spring解析Aop的过程中初始化的。如果这个bean需要AOP来做一些事,就会取 synthetic 的默认值为 false,否则就会在解析aop标签的过程中为它设置true。

private AbstractBeanDefinition parseAdvice(
   String aspectName, int order, Element aspectElement, Element adviceElement, ParserContext parserContext,
   List<BeanDefinition> beanDefinitions, List<BeanReference> beanReferences) {
  try {
   this.parseState.push(new AdviceEntry(parserContext.getDelegate().getLocalName(adviceElement)));
   // create the method factory bean
   RootBeanDefinition methodDefinition = new RootBeanDefinition(MethodLocatingFactoryBean.class);
   methodDefinition.getPropertyValues().add("targetBeanName", aspectName);
   methodDefinition.getPropertyValues().add("methodName", adviceElement.getAttribute("method"));
   methodDefinition.setSynthetic(true);
   // create instance factory definition
   RootBeanDefinition aspectFactoryDef =
     new RootBeanDefinition(SimpleBeanFactoryAwareAspectInstanceFactory.class);
   aspectFactoryDef.getPropertyValues().add("aspectBeanName", aspectName);
   aspectFactoryDef.setSynthetic(true);
   // register the pointcut
   AbstractBeanDefinition adviceDef = createAdviceDefinition(
     adviceElement, parserContext, aspectName, order, methodDefinition, aspectFactoryDef,
     beanDefinitions, beanReferences);
   // configure the advisor
   RootBeanDefinition advisorDefinition = new RootBeanDefinition(AspectJPointcutAdvisor.class);
   advisorDefinition.setSource(parserContext.extractSource(adviceElement));
   advisorDefinition.getConstructorArgumentValues().addGenericArgumentValue(adviceDef);
   if (aspectElement.hasAttribute(ORDER_PROPERTY)) {
    advisorDefinition.getPropertyValues().add(
      ORDER_PROPERTY, aspectElement.getAttribute(ORDER_PROPERTY));
   }
   // register the final advisor
   parserContext.getReaderContext().registerWithGeneratedName(advisorDefinition);
   return advisorDefinition;
  }
  finally {
   this.parseState.pop();
  }
 }

你可能感兴趣的:(如何判断bean实例化用AOP代理)