spring 如何知道哪个bean是需要生成代理对象的?-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

2016-03-17 11:20:24 7601 2

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

取消 提交回答
全部回答(2)
  • 断桥梅
    2019-07-17 19:04:55

    个人理解。
    resolveBeforeInstantiation可以理解为Spring给BeanPostProcessors开放的一个回调,即可以配置BeanPostProcessor,然后在postProcessBeforeInitialization或者postProcessAfterInitialization方法中直接实例化一个对象并返回,这样当Spring调用这个方法时发现已经生成了对象,就不会再调用doCreate进行生成了。
    你说的代理对象就是对BeanPostProcessor的一个具体实现,比如如果你希望对A Bean进行代理,那么可以配置一个BeanPostProcessor,在其中的postProcessBeforeInitialization方法中直接返回一个A 类的代理对象。

    0 0
  • a123456678
    2019-07-17 19:04:55

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

    0 0
添加回答
相关问答

1

回答

spring有几种对象的创建方式?

2022-03-31 18:22:08 227浏览量 回答数 1

1

回答

Spring Boot提供了更简单的注解对吗?

2021-11-18 22:09:26 165浏览量 回答数 1

1

回答

Spring Boot 可以兼容老 Spring 项目吗?

2021-11-03 00:09:39 342浏览量 回答数 1

1

回答

Spring Boot 的核心注解由哪几个注解组成的?

2021-10-24 16:26:22 296浏览量 回答数 1

1

回答

Spring Boot 默认配置文件是什么?

2021-10-21 22:12:27 255浏览量 回答数 1

1

回答

如何打包 Spring Boot 项目?

2021-10-21 21:50:02 185浏览量 回答数 1

1

回答

Spring Boot 的核心注解是哪个?

2021-10-21 22:19:31 123浏览量 回答数 1

1

回答

spring boot启动报错org.springframework.beans?400报错

2020-06-06 15:38:17 910浏览量 回答数 1

1

回答

Spring Boot 的配置文件有哪几种格式?它们有什么区别?

2019-11-18 15:02:40 1394浏览量 回答数 1

2

回答

Spring Boot 启动zuul的时候是不是必须要使用到eureka?

2019-06-24 13:11:50 4159浏览量 回答数 2
+关注
0
文章
14879
问答
问答排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载