如何判断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();
  }
 }

转载于:https://my.oschina.net/u/2345354/blog/476639

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Bean的生命周期是指在Spring容器中,一个Bean从被实例化到最终销毁的整个过程。根据引用的描述,Bean的生命周期包括以下几个步骤: (1)实例化Bean:根据配置情况调用Bean构造方法或工厂方法来创建Bean的实例。 (2)属性注入:利用依赖注入的方式,将Bean中所有属性的配置值进行注入。 (3)Aware接口回调:如果Bean实现了特定的Aware接口,Spring将会在这一步调用相应的方法,以便让Bean感知到容器的一些信息。 (4)初始化方法:在Bean的所有属性被注入后,执行Bean的初始化方法,可以通过配置指定初始化方法的名称。 (5)Bean后置处理器:在Bean的初始化方法执行前后,会调用注册的Bean后置处理器来对Bean进行增强处理。 (6)销毁方法:在容器关闭或者明确销毁Bean的情况下,执行Bean的销毁方法,可以通过配置指定销毁方法的名称。 根据引用和引用的描述,AOP(面向切面编程)是Spring的一种特殊处理,主要在Bean的生命周期中进行。在AOP中,可以通过配置切点、切面和通知等来实现对Bean的增强功能,如日志记录、事务管理等。AOP的实现依赖于动态代理或字节码增强技术,可以在Bean的实例化过程中动态地为其织入额外的行为。 综上所述,Bean的生命周期和AOP是Spring中的两个重要概念。Bean的生命周期包括实例化、属性注入、初始化、销毁等步骤,而AOP则是在Bean的生命周期中对其进行增强处理的一种特殊机制。<span class="em">1</span><span class="em">2</span><span class="em">3</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值