在createBeanInstance()方法中,根据指定的初始化策略,使用简单工厂、工厂方法或者容器的自动装配特性生成Java 实例对象,创建对象的源码如下:

//创建Bean的实例对象
protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {// Make sure bean class is actually resolved at this point.//检查确认Bean是可实例化的Class<?> beanClass = resolveBeanClass(mbd, beanName);//使用工厂方法对Bean进行实例化if (beanClass != null && !Modifier.isPublic(beanClass.getModifiers()) && !mbd.isNonPublicAccessAllowed()) {throw new BeanCreationException(mbd.getResourceDescription(), beanName,"Bean class isn't public, and non-public access not allowed: " + beanClass.getName());}Supplier<?> instanceSupplier = mbd.getInstanceSupplier();if (instanceSupplier != null) {return obtainFromSupplier(instanceSupplier, beanName);}if (mbd.getFactoryMethodName() != null)  {//调用工厂方法实例化return instantiateUsingFactoryMethod(beanName, mbd, args);}// Shortcut when re-creating the same bean...//使用容器的自动装配方法进行实例化boolean resolved = false;boolean autowireNecessary = false;if (args == null) {synchronized (mbd.constructorArgumentLock) {if (mbd.resolvedConstructorOrFactoryMethod != null) {resolved = true;autowireNecessary = mbd.constructorArgumentsResolved;}}}if (resolved) {if (autowireNecessary) {//配置了自动装配属性,使用容器的自动装配实例化//容器的自动装配是根据参数类型匹配Bean的构造方法return autowireConstructor(beanName, mbd, null, null);}else {//使用默认的无参构造方法实例化return instantiateBean(beanName, mbd);}}// Need to determine the constructor...//使用Bean的构造方法进行实例化Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);if (ctors != null ||mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_CONSTRUCTOR ||mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args))  {//使用容器的自动装配特性,调用匹配的构造方法实例化return autowireConstructor(beanName, mbd, ctors, args);}// No special handling: simply use no-arg constructor.//使用默认的无参构造方法实例化return instantiateBean(beanName, mbd);
}
//使用默认的无参构造方法实例化Bean对象
protected BeanWrapper instantiateBean(final String beanName, final RootBeanDefinition mbd) {try {Object beanInstance;final BeanFactory parent = this;//获取系统的安全管理接口,JDK标准的安全管理APIif (System.getSecurityManager() != null) {//这里是一个匿名内置类,根据实例化策略创建实例对象beanInstance = AccessController.doPrivileged((PrivilegedAction<Object>) () ->getInstantiationStrategy().instantiate(mbd, beanName, parent),getAccessControlContext());}else {//将实例化的对象封装起来beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, parent);}BeanWrapper bw = new BeanWrapperImpl(beanInstance);initBeanWrapper(bw);return bw;}catch (Throwable ex) {throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Instantiation of bean failed", ex);}
}

经过对上面的代码分析,我们可以看出,对使用工厂方法和自动装配特性的Bean 的实例化相当比较清楚,调用相应的工厂方法或者参数匹配的构造方法即可完成实例化对象的工作,但是对于我们最常使用的默认无参构造方法就需要使用相应的初始化策略(JDK 的反射机制或者CGLib)来进行初始化了,在方法getInstantiationStrategy().instantiate()中就具体实现类使用初始策略实例化对象。

选择Bean 实例化策略相关推荐

  1. 手写Spring-第三章-来填坑吧!有参bean的实例化策略

    前言 上次我们终于把bean实例化这一步骤交给Spring容器了,这是个了不起的进步.但是,我们还是埋下了一个坑,那就是,这个实例化的手段,过于粗糙了.我们仅仅是简单的调用了newInstance方法 ...

  2. 天天用 Spring,bean 实例化原理你懂吗?

    来源:小小木的博客 www.cnblogs.com/wyc1994666/p/10650480.html 本次主要想写spring bean的实例化相关的内容.创建spring bean 实例是spr ...

  3. 手写简版spring --3--对象实例化策略

    一.目标 这一章节的目标主要是为了解决上一章节我们埋下的坑,那是什么坑呢?其实就是一个关于 Bean 对象在含有构造函数进行实例化的坑.在上一章节我们扩充了 Bean 容器的功能,把实例化对象交给容器 ...

  4. Spring 源码--Bean 实例化

    上一篇的 BeanWrapper 我们介绍了 BeanWrapper 的来由.现在我们继续看看 Spring 是如何构造一个 Bean 的. 代码不长.也不是特别的复杂 /*** 使用合适的实例化策略 ...

  5. Spring源码解析-bean实例化

    Spring源码解析-bean实例化 ​ 本文介绍Spring创建 bean 过程中的第一个步骤:实例化 bean. 1. Bean实例化源码 ​ 虽然实例化Bean有多种方式(包括静态工厂和工厂实例 ...

  6. Spring源码解析二之创建Bean(实例化)

    上一节我们分析到了createBean,而真正创建Bean的过程在doCreateBean过程,我们可以发现Spring的编码风格,do才是真正的过程,不带do的通常是在做在准备过程,并且我们跳过了一 ...

  7. 05 Bean实例化整体流程

    由于md文档部分hugo插件语法不兼容,建议访问作者网站查阅文章:wlizhi.cc spring源码系列文章,示例代码的中文注释,均是 copy 自 https://gitee.com/wlizhi ...

  8. Adam那么棒,为什么还对SGD念念不忘 (3)—— 优化算法的选择与使用策略

    在前面两篇文章中,我们用一个框架梳理了各大优化算法,并且指出了以Adam为代表的自适应学习率优化算法可能存在的问题.那么,在实践中我们应该如何选择呢? 本文介绍Adam+SGD的组合策略,以及一些比较 ...

  9. Spring的Bean实例化、属性注入、对象注入、复杂注入(基于xml配置方式)

    一.Bean实例化的三种方式: (1)使用类的无参构造创建 (2)使用静态工厂创建 (3)使用实例工厂创建 代码实例: (1)项目结构: (2)在pom.xml中导入spring的核心jar包依赖: ...

最新文章

  1. Ubuntu网络设置
  2. 《经济学人》也谈 Python:它会是我们的未来吗?
  3. 抖音AI火了!以视频搜视频,不知小姐姐叫什么,也能搜出她的影像
  4. POJ 3414 Pots【广搜】
  5. 深度学习(三)theano学习笔记(2)基础函数-未完待续
  6. height百分比以及高度自适应问题
  7. fstat、stat和lstat 区别
  8. SQL2008触发器
  9. 三大代码审计工具对比
  10. KC伺服舵机带参控制程序程序
  11. python语言for else和 if else误区
  12. C++中如何获取一个文件夹下带有指定文件后缀名的文件绝对路径
  13. 微信小程序解决 加载图片出现渲染层网络层错误
  14. java小易——Servlet轻量级服务
  15. 工作量评估--专家评估法实际操作心得
  16. Echarts去除x轴,y轴网格线,网格区域(背景)
  17. 解读电力调度、电力市场、技术创新,国网南网新型电力系统行动方案
  18. csu1726 你经历过绝望吗?两次!
  19. PMP考试自学可以吗? 一分钟让你搞清楚
  20. 学习编程的第32天-不忘初衷

热门文章

  1. JS中数据结构之队列
  2. 关于Oracle RAC节点间免密码策略
  3. zTree使用技巧与详解
  4. mysql笔记03 查询性能优化
  5. 微信公众平台开发(73) 客服接口发送客服消息
  6. 《javascript高级程序设计》第六章总结
  7. 一起学Android之Menu
  8. 独家解读 | 滴滴机器学习平台架构演进之路
  9. java B2B2C Springboot电子商城系统 (六) 分布式配置中心(Spring Cloud Config)
  10. linux 网桥的管理和搭建