AbstractBeanFactory 类中生产Bean 实例对象的主要源码如下:

//Bean工厂生产Bean实例对象
protected Object getObjectFromFactoryBean(FactoryBean<?> factory, String beanName, boolean shouldPostProcess) {//Bean工厂是单态模式,并且Bean工厂缓存中存在指定名称的Bean实例对象if (factory.isSingleton() && containsSingleton(beanName)) {//多线程同步,以防止数据不一致synchronized (getSingletonMutex()) {//直接从Bean工厂缓存中获取指定名称的Bean实例对象Object object = this.factoryBeanObjectCache.get(beanName);//Bean工厂缓存中没有指定名称的实例对象,则生产该实例对象if (object == null) {//调用Bean工厂的getObject方法生产指定Bean的实例对象object = doGetObjectFromFactoryBean(factory, beanName);// Only post-process and store if not put there already during getObject() call above// (e.g. because of circular reference processing triggered by custom getBean calls)Object alreadyThere = this.factoryBeanObjectCache.get(beanName);if (alreadyThere != null) {object = alreadyThere;}else {if (shouldPostProcess) {try {object = postProcessObjectFromFactoryBean(object, beanName);}catch (Throwable ex) {throw new BeanCreationException(beanName,"Post-processing of FactoryBean's singleton object failed", ex);}}//将生产的实例对象添加到Bean工厂缓存中this.factoryBeanObjectCache.put(beanName, object);}}return object;}}//调用Bean工厂的getObject方法生产指定Bean的实例对象else {Object object = doGetObjectFromFactoryBean(factory, beanName);if (shouldPostProcess) {try {object = postProcessObjectFromFactoryBean(object, beanName);}catch (Throwable ex) {throw new BeanCreationException(beanName, "Post-processing of FactoryBean's object failed", ex);}}return object;}
}
//调用Bean工厂的getObject方法生产指定Bean的实例对象
private Object doGetObjectFromFactoryBean(final FactoryBean<?> factory, final String beanName)throws BeanCreationException {Object object;try {if (System.getSecurityManager() != null) {AccessControlContext acc = getAccessControlContext();try {//实现PrivilegedExceptionAction接口的匿名内置类//根据JVM检查权限,然后决定BeanFactory创建实例对象object = AccessController.doPrivileged((PrivilegedExceptionAction<Object>) () ->factory.getObject(), acc);}catch (PrivilegedActionException pae) {throw pae.getException();}}else {//调用BeanFactory接口实现类的创建对象方法object = factory.getObject();}}catch (FactoryBeanNotInitializedException ex) {throw new BeanCurrentlyInCreationException(beanName, ex.toString());}catch (Throwable ex) {throw new BeanCreationException(beanName, "FactoryBean threw exception on object creation", ex);}// Do not accept a null value for a FactoryBean that's not fully// initialized yet: Many FactoryBeans just return null then.//创建出来的实例对象为null,或者因为单态对象正在创建而返回nullif (object == null) {if (isSingletonCurrentlyInCreation(beanName)) {throw new BeanCurrentlyInCreationException(beanName, "FactoryBean which is currently in creation returned null from getObject");}object = new NullBean();}return object;
}

从上面的源码分析中,我们可以看出,BeanFactory 接口调用其实现类的getObject 方法来实现创建Bean 实例对象的功能。

AbstractBeanFactory 生产Bean 实例对象相关推荐

  1. initializeBean()方法为容器产生的Bean 实例对象添加BeanPostProcessor 后置处理器

    同样在AbstractAutowireCapableBeanFactory 类中,initializeBean()方法实现为容器创建的Bean实例对象添加BeanPostProcessor 后置处理器 ...

  2. 工厂Bean 的实现类getObject 方法创建Bean 实例对象

    FactoryBean 的实现类有非常多,比如:Proxy.RMI.JNDI.ServletContextFactoryBean 等等,FactoryBean 接口为Spring 容器提供了一个很好的 ...

  3. factorybean 代理类不能按照类型注入_彻底搞懂依赖注入(一)Bean实例创建过程

    点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 上一章介绍了Bean的加载过程(IOC初始化过程),加载完成后,紧接着就要用到它的依赖注入 ...

  4. AbstractAutoWireCapableBeanFactory 对Bean 实例进行属性依赖注入

    应用第一次通过getBean()方法(配置了lazy-init 预实例化属性的除外)向IOC 容器索取Bean 时,容器创建Bean 实例对象, 并且对Bean 实例对象进行属性依赖注入,Abstra ...

  5. Spring IOC 容器源码分析 - 填充属性到 bean 原始对象

    1. 简介 本篇文章,我们来一起了解一下 Spring 是如何将配置文件中的属性值填充到 bean 对象中的.我在前面几篇文章中介绍过 Spring 创建 bean 的流程,即 Spring 先通过反 ...

  6. Spring容器中获取Bean实例的七种方式(附实战源码)

    目录 写作说明 一:写作原因 二:源码出处 实现方式 一:使用BeanFactory直接获取(不推荐) 二:在初始化时保存ApplicationContext对象 三:继承自抽象类Applicatio ...

  7. java手工注入bean_java相关:Spring中如何动态注入Bean实例教程

    java相关:Spring中如何动态注入Bean实例教程 发布于 2020-3-8| 复制链接 摘记: 前言在Spring中提供了非常多的方式注入实例,但是由于在初始化顺序的不同,基于标注的注入方式, ...

  8. es6 Class 的实例对象

    Class 的实例对象 ES6 生成类的实例对象的写法,与 ES5 完全一样,也是使用new命令.前面说过,如果忘记加上new,像函数那样调用Class,将会报错. class Point { // ...

  9. Spring 4.x 源码系列4-创建bean实例

    创建bean实例(createBeanInstance 方法) AbstractAutowireCapableBeanFactory 的 createBeanInstance 方法实现了创建 bean ...

最新文章

  1. 我与前端之间不得不说的三天两夜之javaScript
  2. springJDBC实现查询方法二
  3. GitHub超3万星:Transformer 3发布,BERT被一分为二
  4. 大势所趋!Octane Raceway开辟VR竞技场
  5. “约见”面试官系列之常见面试题之第七十六篇之vue-router中的路由钩子函数基本用法 (建议收藏)
  6. dataframe第二列 r语言_123.R简介和统计绘图
  7. uva 784 Maze Exploration
  8. 为 VS Code 配置 C++ task,增加外部库文件并且自动运行脚本 | 应用 powershell 语句
  9. 主节点数量_你知道电气主接线常见接线方式吗?建议收藏共同学习
  10. 201671010119 2016-2017-2《Java程序设计》第十六周学习心得
  11. 迅捷CAD格式转换器专业版
  12. 禁用惠普服务器自动开机,惠普商用台式机如何在BIOS中设置通电自动开机
  13. 图像处理特征提取之(二):Haar特征
  14. shopex服务器信息,shopex_全手册.doc
  15. git 上传文件过大问题
  16. Emacs - Verilog mode 自动实例化
  17. 写完十四章卡农后,莫比乌斯带属实是给巴赫玩明白了
  18. Mysql设置自动更新时间
  19. 【每日最爱一句】2013.06.10
  20. 前端url编码解码方法

热门文章

  1. 想要成为Java架构师不容放过的知识—Maven的版本发布
  2. 长脖子鹿省选模拟赛 [LnOI2019SP]快速多项式变换(FPT)
  3. 【python 3.6】python读取json数据存入MySQL(一)
  4. css相关笔记(五)
  5. 简单的实现图片预览, 通过原生ajax以及 jQuery两种方法实现图片预览,有更好的办法可以留言喔...................
  6. Oracle11gR2-聚簇因子浅析
  7. 修改选择文件按钮,变成自己设置的样式
  8. FreeMarker模板文件的组成(2)
  9. java操作当前日期的年月日
  10. scala:异常处理(try/catch)