热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Spring源码解析(二)SpringBean创建

Spring容器获取Bean和创建Bean都会调用getBean()方法getBean()--doGetBean()1.transformedBeanName(name);获取b

Spring容器获取Bean和创建Bean都会调用getBean()方法

getBean() --> doGetBean()
1.transformedBeanName(name);获取beanName,可能存在别名(aliasMap)
2.getSingleton(beanName);从缓存(singletonObjects)中获取,若存在则返回
3.获取容器的父容器,若存在父容器并且当前Bean定义不存在当前容器中,则尝试从父容器中获取
4.getMergedLocalBeanDefinition(beanName);获取Bean的Bean定义,并校验是否为抽象类
5.从Bean中获取依赖的Bean(dependsOn),若存在,则先创建依赖的Bean,创建方式即当前过程getBean()
6.创建singletion,调用getSingleton()->createBean(),在创建前后会修改各种容器中的值,防止重复创建或冲突等情况
7.创建prototype,调用createBean(),在创建前后会修改各种容器中的值,防止重复创建或冲突等情况
8.创建其他scope(request,session)。创建时会在request中或session中获取,获取不到调用createBean(),在创建前后会修改各种容器中的值,防止重复创建或冲突等情况

createBean()
1.resolveBeanClass(mbd, beanName);获取Bean的类型
2.调用后置处理器InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation(beanClass, beanName)方法
  若后置处理器返回对象,则调用后置处理器InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation(beanClass, beanName)方法,并返回对象
  该后置处理器的作用是在对象创建前,给一个创建代理的机会,AOP的实现就是用来该方式。
3.调用真正的创建方法doCreateBean(beanName, mbdToUse, args);
4.调用后置处理器SmartInstantiationAwareBeanPostProcessor的determineCandidateConstructors(beanClass, beanName)方法,用于获取构造器
5.如果获取到构造器,则用当前构造器创建对象,若获取不到则使用无参构造器创建instantiateBean(beanName, mbd),到此Bean已创建但未初始化
6.调用后置处理器MergedBeanDefinitionPostProcessor的postProcessMergedBeanDefinition(mbd, beanType, beanName)方法
7.populateBean(beanName, mbd, instanceWrapper);填充Bean,设置属性
  7.1 调用后置处理器InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation(beanClass, beanName)方法
  7.2 调用后置处理器InstantiationAwareBeanPostProcessor的postProcessPropertyValues()方法,返回PropertyValues
  7.3 applyPropertyValues(beanName, mbd, bw, pvs);应用返回的属性值
8.initializeBean(beanName, exposedObject, mbd);初始化Bean
  7.1 调用Aware接口的方法invokeAwareMethods()。BeanNameAware、BeanClassLoaderAware、BeanFactoryAware
  7.2 调用后置处理器BeanPostProcessor的postProcessBeforeInitialization()方法
  7.3 执行初始化方法invokeInitMethods()。InitializingBean.afterPropertiesSet()、@Bean注解initMethod属性指定的方法
  7.4 调用后置处理器BeanPostProcessor的postProcessAfterInitialization()方法
  7.5 判断Bean是否有销毁方法、@Bean注解destoryMethod属性指定的方法。若有把方法封装成DisposableBeanAdapter并注入到容器中,容器关闭时调用

 

《Spring源码解析(一)--Spring容器刷新》

《Spring源码解析(二)--Spring Bean创建》

《Spring源码解析(三)--AOP实现原理》

https://www.cnblogs.com/zhuqianchang/p/11423611.html

转:https://www.cnblogs.com/zhuqianchang/p/11418189.html



推荐阅读
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文详细介绍了如何构建一个高效的UI管理系统,集中处理UI页面的打开、关闭、层级管理和页面跳转等问题。通过UIManager统一管理外部切换逻辑,实现功能逻辑分散化和代码复用,支持多人协作开发。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 实体映射最强工具类:MapStruct真香 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 本文将深入探讨如何在不依赖第三方库的情况下,使用 React 处理表单输入和验证。我们将介绍一种高效且灵活的方法,涵盖表单提交、输入验证及错误处理等关键功能。 ... [详细]
  • 本文详细介绍了在企业级项目中如何优化 Webpack 配置,特别是在 React 移动端项目中的最佳实践。涵盖资源压缩、代码分割、构建范围缩小、缓存机制以及性能优化等多个方面。 ... [详细]
  • 本文介绍了Linux系统中的文件IO操作,包括文件描述符、基本文件操作函数以及目录操作。详细解释了各个函数的参数和返回值,并提供了代码示例。 ... [详细]
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
  • 本文详细介绍了C++中map容器的多种删除和交换操作,包括clear、erase、swap、extract和merge方法,并提供了完整的代码示例。 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • 配置Windows操作系统以确保DAW(数字音频工作站)硬件和软件的高效运行可能是一个复杂且令人沮丧的过程。本文提供了一系列专业建议,帮助你优化Windows系统,确保录音和音频处理的流畅性。 ... [详细]
  • GIMP 2.99.2 发布:UI 采用 GTK3 实现、原生支持高分屏和 Wayland
    开源项目评选最后一周,手里的5票再不用就没用了https:www.oschina.netprojecttop_cn_2020GIMP2.99.2已发布,同时这也标志着GIMP3.0的到来,其中最显著的变化是从GTK2过渡到GTK3工具包。基于 ... [详细]
author-avatar
烦了_12664
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有