//对配置lazy-init属性单态Bean的预实例化
@Override
public void preInstantiateSingletons() throws BeansException {if (this.logger.isDebugEnabled()) {this.logger.debug("Pre-instantiating singletons in " + this);}// Iterate over a copy to allow for init methods which in turn register new bean definitions.// While this may not be part of the regular factory bootstrap, it does otherwise work fine.List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);// Trigger initialization of all non-lazy singleton beans...for (String beanName : beanNames) {//获取指定名称的Bean定义RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);//Bean不是抽象的,是单态模式的,且lazy-init属性配置为falseif (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {//如果指定名称的bean是创建容器的Beanif (isFactoryBean(beanName)) {//FACTORY_BEAN_PREFIX=”&”,当Bean名称前面加”&”符号//时,获取的是产生容器对象本身,而不是容器产生的Bean.//调用getBean方法,触发容器对Bean实例化和依赖注入过程final FactoryBean<?> factory = (FactoryBean<?>) getBean(FACTORY_BEAN_PREFIX + beanName);//标识是否需要预实例化boolean isEagerInit;if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {//一个匿名内部类isEagerInit = AccessController.doPrivileged((PrivilegedAction<Boolean>) () ->((SmartFactoryBean<?>) factory).isEagerInit(),getAccessControlContext());}else {isEagerInit = (factory instanceof SmartFactoryBean &&((SmartFactoryBean<?>) factory).isEagerInit());}if (isEagerInit) {//调用getBean方法,触发容器对Bean实例化和依赖注入过程getBean(beanName);}}else {getBean(beanName);}}}// Trigger post-initialization callback for all applicable beans...for (String beanName : beanNames) {Object singletonInstance = getSingleton(beanName);if (singletonInstance instanceof SmartInitializingSingleton) {final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance;if (System.getSecurityManager() != null) {AccessController.doPrivileged((PrivilegedAction<Object>) () -> {smartSingleton.afterSingletonsInstantiated();return null;}, getAccessControlContext());}else {smartSingleton.afterSingletonsInstantiated();}}}
}

通过对lazy-init 处理源码的分析,我们可以看出,如果设置了lazy-init 属性,则容器在完成Bean 定义的注册之后,会通过getBean 方法,触发对指定Bean 的初始化和依赖注入过程,这样当应用第一次向容器索取所需的Bean 时,容器不再需要对Bean 进行初始化和依赖注入,直接从已经完成实例化和依赖注入的Bean 中取一个现成的Bean,这样就提高了第一次获取Bean 的性能。

DefaultListableBeanFactory 对配置lazy-init 属性单态Bean 的预实例化相关推荐

  1. finishBeanFactoryInitialization 处理预实例化Bean

    当Bean 定义资源被载入IOC 容器之后, 容器将Bean 定义资源解析为容器内部的数据结构BeanDefinition 注册到容器中,AbstractApplicationContext 类中的f ...

  2. Spring Bean的配置及常用属性

    作为 Spring 核心机制的依赖注入,改变了传统的编程习惯,对组件的实例化不再由应用程序完成,转而交由 Spring 容器完成,在需要时注入应用程序中,从而对组件之间依赖关系进行了解耦.这一切都离不 ...

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

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

  4. 零配置 之 Spring注解实现Bean定义

    转载自  零配置 之 12.3 注解实现Bean定义 --跟我学spring3 12.3  注解实现Bean定义 12.3.1  概述 前边介绍的Bean定义全是基于XML方式定义配置元数据,且在[1 ...

  5. SpringBoot_配置-@PropertySource、@ImportResource、@Bean

    前面说了@ConfigurationProperties和@Value的一些区别和用法,我们再来说两个注解,一个叫PropertySource,一个叫@ImportResource,第一个Proper ...

  6. springmvc配置MappingJackson2HttpMessageConverter实现属性驼峰和下划线的转换

    需求 php调用java接口时,因为php那边的属性都是下划线风格,java这边的属性都是驼峰的风格.配置springmvc的json转换,在requestBody的时候(调用对象的set 方法)将j ...

  7. Spring-Bean配置-使用外部属性文件(转)

    Spring-Bean配置-使用外部属性文件 所以可以通过@value注解获取配置文件的key-value,生成一个配置文件bean.用以在代码中直接使用bean的方式. •在配置文件里配置Bean时 ...

  8. Windows2008 R2下,DCOM配置里的属性灰色不可用的解决方法

    Windows2008 R2下,DCOM配置里的属性灰色不可用的解决方法 参考文章: (1)Windows2008 R2下,DCOM配置里的属性灰色不可用的解决方法 (2)https://www.cn ...

  9. 比较一个对象,如是这个对象的某一个属性不为空,把他copy到另一个有这个属性的bean中...

    2019独角兽企业重金招聘Python工程师标准>>> import java.beans.PropertyDescriptor; import java.lang.reflect. ...

最新文章

  1. C C++语言指针学习!(基础篇!) 指针的掌握真滴是分水岭呦~
  2. 数据的标准化和标准化方法
  3. jquery拼接后css样式不生效_JQuery常用选择器以及操作属性和样式的方法介绍
  4. DL之yolov3:使用yolov3算法时需要对Ubuntu系统进行配置的简介、过程步骤之详细攻略
  5. Java多线程--list.parallelStream().forEach()使用实例
  6. 纪中A组模拟赛总结(2021.7.13)
  7. JAX-RS和JSON-P集成
  8. [vue] webpack打包vue速度太慢怎么办?
  9. 怎么安装python3.7 setuptools与pip_如何安装python到setuptools、pip工具安装
  10. 网易云api及 asrsea 加密参数文档
  11. Linux设备驱动开发详解-Note(5)---Linux 内核及内核编程(1)
  12. 西游中算命先生袁守诚泄露了天机,为何却是泾河龙王被砍头?
  13. 漫画:如何用栈实现队列?
  14. SQL中Left Join 与Right Join 与 Inner Join 与 Full Join的区别
  15. IDEA控制台乱码终极解决方案
  16. 学霸辞掉百万年薪只为专心“玩”纸,却推动了航天、医学等领域进步
  17. 硬件驱动为什么要有WHQL数字签名
  18. 【操作系统原理-陈渝老师】第七章 进程与线程
  19. C/C++音乐播放(亲测有效)
  20. 2011年国外最受欢迎的15个电影网站

热门文章

  1. 关于正则表达式的那些个爱恨情仇
  2. Spring Boot 启动载入数据 CommandLineRunner
  3. ListCtrl添加右键菜单(ListCtrl类里编辑,给ListCtrl 发送NM_RCLICK消息)
  4. Gartner最新发布:2017年十大战略技术趋势
  5. Android Activity/Fragment间的数据传递
  6. 洛谷 P1800 software_NOI导刊2010提高(06)(二分答案+DP检验)
  7. 用shell批量转储表
  8. 免费开源分布式系统日志收集框架 Exceptionless
  9. POJ 1273 (基础最大流) Drainage Ditches
  10. openresty 环境搭建