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

可不可以不要昵称 发布于 2014/07/15 14:51
阅读 1K+
收藏 1

最近问了很多个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是需要返回代理对象的,从源码的角度说下,期待。。。。。

加载中
0
Jack_Q
Jack_Q

spring aop:aspect 标签就指定了啊。spring读取到aop标签会把bean通过Proxyfactory转化为动态代理对象。

可不可以不要昵称
可不可以不要昵称
spring读到config标签的时候只做了两件事情,注册一个proxyCreator,解析config标签下面的子标签为beanDefinition,并放入parserContext中, 那个proxyCreator是一个后置处理器,spring会在createBean的时候调用,我要问的就是spring怎么确定要进入到调用后置处理器这段代码的,懂没 ?
可不可以不要昵称
可不可以不要昵称
你说的是已经知道要返回代理对象了,请看我的问题。 我问的是在createBean的时候 如果知道这个bean是需要生成代理对象的?
返回顶部
顶部