开发者社区> 问答> 正文

spring 如何知道哪个bean是需要生成代理对象的?

最近问了很多个spring相关的问题,好像满意答案的真心没有几个,今天问最后一个关于aop的问题,请高手指点。

通过查看源码发现,代理对象的生成是在getBean的时,代码如下

try {
   // Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
   Object bean = resolveBeforeInstantiation(beanName, mbd);
   if (bean != null) {
    return bean;
   }
  }
  catch (Throwable ex) {
   throw new BeanCreationException(mbd.getResourceDescription(), beanName,
     "BeanPostProcessor before instantiation of bean failed", ex);
  }

  Object beanInstance = doCreateBean(beanName, mbd, args);

如果是生成代理对象,就不会调用后面的doCreateBean了,但是在resolveBeforeInstantiation中我晕呼了,

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() && hasInstantiationAwareBeanPostProcessors()) { 
    bean = applyBeanPostProcessorsBeforeInstantiation(mbd.getBeanClass(), beanName); 
    if (bean != null) { 
     bean = applyBeanPostProcessorsAfterInitialization(bean, beanName); 
    } 
   } 
   mbd.beforeInstantiationResolved = (bean != null); 
  } 
  return bean; 
 }
在上面的代码中那两个if里面判断的那些值是什么时候设置进去的,分别代表什么意思?

比如我现在我配置如下:

<bean id="123" class="xxx"></bean>

<aop:config>

  <aop:aspect ref="123" id="as">

    <aop:before point-cut="....">

 </aop:aspect>

</aop:config>

然后我调用getBean(“123”),spring是怎么知道这个123是需要返回代理对象的,从源码的角度说下,期待。。。。。

展开
收起
a123456678 2016-03-17 11:20:24 9630 0
2 条回答
写回答
取消 提交回答
  • 个人理解。
    resolveBeforeInstantiation可以理解为Spring给BeanPostProcessors开放的一个回调,即可以配置BeanPostProcessor,然后在postProcessBeforeInitialization或者postProcessAfterInitialization方法中直接实例化一个对象并返回,这样当Spring调用这个方法时发现已经生成了对象,就不会再调用doCreate进行生成了。
    你说的代理对象就是对BeanPostProcessor的一个具体实现,比如如果你希望对A Bean进行代理,那么可以配置一个BeanPostProcessor,在其中的postProcessBeforeInitialization方法中直接返回一个A 类的代理对象。

    2019-07-17 19:04:55
    赞同 展开评论 打赏
  • spring aop:aspect 标签就指定了啊。spring读取到aop标签会把bean通过Proxyfactory转化为动态代理对象

    2019-07-17 19:04:55
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第20讲):经典面试题与阿里等名企内部招聘求职面试技巧 立即下载
微服务架构模式与原理Spring Cloud开发实战 立即下载
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库 立即下载

相关实验场景

更多