热门标签 | 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



推荐阅读
  • 本文探讨如何利用Java反射技术来模拟Webwork框架中的URL解析过程。通过这一实践,读者可以更好地理解Webwork及其后续版本Struts2的工作原理,尤其是它们在MVC架构下的角色。 ... [详细]
  • Java 架构:深入理解 JDK 动态代理机制
    代理模式是 Java 中常用的设计模式之一,其核心在于代理类与委托类共享相同的接口。代理类主要用于为委托类提供预处理、过滤、转发及后处理等功能,以增强或改变原有功能的行为。 ... [详细]
  • 本文探讨了使用Filter作为控制器的优势,以及Servlet与Filter之间的主要差异。同时,详细解析了Servlet的工作流程及其生命周期,以及ServletConfig与ServletContext的区别与应用场景。 ... [详细]
  • 本文旨在介绍在iOS平台进行直播技术开发前的准备工作,重点讲解AVFoundation框架的基本概念和使用方法。通过对AVFoundation的深入理解,开发者能够更好地掌握直播应用中的音视频处理技巧。 ... [详细]
  • 本文介绍了数字音视频编解码技术标准,特别是中国自主研发的AVS标准,及其在短视频软件开发中的应用。文章探讨了AVS标准的发展历程、技术特点以及与国际标准的对比。 ... [详细]
  • 本文详细介绍了Java集合框架中的Collection体系,包括集合的基本概念及其与数组的区别。同时,深入探讨了Comparable和Comparator接口的区别,并分析了各种集合类的底层数据结构。最后,提供了如何根据需求选择合适的集合类的指导。 ... [详细]
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
  • 本文介绍了一个优化过的JavaScript函数,用于从API获取电影信息并渲染到网页上,同时注册Service Worker以提升用户体验和性能。 ... [详细]
  • 全能终端工具推荐:高效、免费、易用
    介绍一款备受好评的全能型终端工具——MobaXterm,它不仅功能强大,而且完全免费,适合各类用户使用。 ... [详细]
  • 本文探讨了如何利用 Hibernate 进行高效的批量更新和删除操作,包括直接使用 Hibernate API 的方法及其局限性,以及如何通过 JDBC 或存储过程实现更优的性能。 ... [详细]
  • Flowable 6.6.0 表单引擎在Web应用中的集成与使用
    本文档提供了Flowable 6.6.0版本中表单引擎在Web应用程序中的配置和使用指南,包括表单引擎的初始化、配置以及在Web环境下的具体实现方法。 ... [详细]
  • MyBatis 开发技巧:延迟加载与查询缓存详解
    本文详细探讨了 MyBatis 中的延迟加载和查询缓存机制,旨在帮助开发者更好地理解和利用这些特性来优化数据库访问性能。 ... [详细]
  • iOS绘制就是采集点,贝塞尔曲线得到形状,绘图上下文去渲染出来AsanaDrawsana图形库,设计的挺好他可以画多种图形, ... [详细]
  • 本文介绍如何利用纯CSS技术,通过简单的DOM结构和CSS样式设计,创建一个具有动态光影效果的太阳天气图标。 ... [详细]
  • 编程实践:创建抽奖游戏
    本文详细介绍了如何通过HTML、CSS和JavaScript构建一个简单的在线抽奖游戏,包括布局设计、样式设置和交互逻辑实现。 ... [详细]
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社区 版权所有