AI 助理
备案 控制台
开发者社区 云原生 容器服务 文章 正文

spring源码分析系列3:BeanFactory核心容器的研究

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: spring源码分析系列3:BeanFactory核心容器的研究

@ TOC在讲容器之前,再明确一下知识点。

  • BeanDefinition是Bean在容器的描述。BeanDefinition与Bean不是一个东西。
  • Bean是根据BeanDefinition创建出来的。也即是我们所说的对象。

BeanDefinition物料需要有地方存储,Bean成品需要有地方存。今天我们讲讲仓库。


BeanFactory家族


image.png

此图是默认容器DefaultListableBeanFactory的继承,实现关系图.我们从右向左来分析下.

  1. BeanFactory接口: 容器顶级接口,提供了容器最基本的能力,包括获取bean,是否包含bean,是否单例,获取bean类型,Bean的别名等方法。
  2. ListableBeanFactory接口: BeanFactory的子接口;具有批量获取Bean的能力
  3. HierarchicalBeanFactory接口:具有访问父容器的能力。有层次的BeanFactory。
  4. AutowireCapableBeanFactory接口:继承BeanFactory,扩展了自动装配能力。这个接口更多的作用是用于于与其他框架集成,把不在spring容器中的Bean加入到Spring容器生命周期管理中来。此接口很少用
  5. ConfigurableBeanFactory:定义了BeanFactory的配置。继承HierarchicalBeanFactory和SingletonBeanRegistry接口。实现了此接口的容器,具有层次,单例BeanDefinition注册功能。
  6. ConfigurableListableBeanFactory: 大融合接口,除了具有上述接口的能外,还具有:类加载器,类型转化,属性编辑器,BeanPostProcessor,作用域,bean定义,处理bean依赖关系, bean销毁等功能。
  7. SingletonBeanRegistry接口: 具有Bean的操作能力.注册,查询,获取Bean数量等能力. 注意此处的Bean是实例.区别于BeanDefinition.
  8. SimpleAliasRegistry:Bean的别名操作类,实现了AliasRegistry.具有存储Bean别名,注册Bean别名,获取Bean别名的功能.aliasMap属性存储Bean别名
  9. DefaultSingletonBeanRegistry:除了继承了SimpleAliasRegistry的功能外. 最重要的是实现了SingletonBeanRegistry接口.具有存储Bean实例,注册Bean,获取Bean的能力.我们定义的被Spring管理的Class类的实例对象,以及实例的之间的相互依赖关系都是存储在此类中.默认常用的容器DefaultListableBeanFactory的Bean的相关能力.就是通过间接继承此类来实现的.
/** Disposable bean instances: bean name --> disposable instance */
  private final Map<String, Object> disposableBeans = new LinkedHashMap<String, Object>();
  /** Map between containing bean names: bean name --> Set of bean names that the bean contains */
  private final Map<String, Set<String>> containedBeanMap = new ConcurrentHashMap<String, Set<String>>(16);
  /** Map between dependent bean names: bean name --> Set of dependent bean names */
  private final Map<String, Set<String>> dependentBeanMap = new ConcurrentHashMap<String, Set<String>>(64);
  /** Map between depending bean names: bean name --> Set of bean names for the bean's dependencies */
  private final Map<String, Set<String>> dependenciesForBeanMap = new ConcurrentHashMap<String, Set<String>>(64)
  1. FactoryBeanRegistrySupport: 提供多工厂Bean的支持.FactoryBean通过其名字我也可以看出是生产Bean的Bean.
  2. AbstractBeanFactory抽象类: 承上启下.从图中我们看出. AbstractBeanFactory.通过继承关系,继承FactoryBeanRegistrySupport各种能力.而且实现了右边部分接口.已然是比较完备的Bean容器了.AbstractBeanFactory还通过模板模式定义了获取Bean的算法骨架,
  3. AbstractAutowireCapableBeanFactory: .具有大部分的能力. 实现了AbstractBeanFactory定义的模板方法.其中doCreateBean方法逻辑是把一个BeanDefinition变成Bean的过程.这个方法非常重要.通常我们使用类创建对象.直接new出来. spring把BeanDefinition到Bean的过程模板化,留下了很多扩展点. 留给使用者可以在不同的时刻自定义BeanDefition创建Bean的过程.
  4. DefaultListableBeanFactory常用的默认容器实现,也是spring最常使用的容器类.看左边DefaultListableBeanFactory实现了BeanDefinitionRegistry接口. 这说明什么?说明DefaultListableBeanFactory具有存储BeanDefinition,操作BeanDefinition的能力.DefaultListableBeanFactory通过继承关系也具有了Bean的存储操作功能.

小结:

  1. BeanFactory体系,接口分明,完美的体现了接口分离原则。
  2. BeanFactory体系中有两种存储,一种是BeanDefinition的存储,另一个是Bean的存储.
  3. DefaultListableBeanFactory作为最常用的容器类.不但具有BeanDefinition的存储操作功能,而且通过继承具有Bean的存储操作功能.DefaultListableBeanFactory把存储的BeanDefinition通过一定算法创建Bean并存储起来.


BeanDefinition,BeanFactory,Bean三者关系


通过上面的对各个接口,类的认识.我们再来看看三者的关系.

我们向BeanFactory容器中注入一个BeanDefinition。BeanFactory帮我们存储起来.当我们想要得到一个Bean时.BeanFactory 帮我们把BeanDefinition创建Bean.并缓存起来.这个创建过程是可参与的.

  • BeanFactory保存了BeanDefiniton与Bean.
  • BeanFactory具有使用BeanDefinition创建Bean的功能
  • BeanFactory允许使用者可以干预BeanDefinition生成Bean的功能.


BeanFactory中的扩展点


设计原则之开闭原则说的特别好:说一个软件实体应该通过扩展来实现变化. 很多优秀的框架都有类似的扩展点设计,列如:

  • Tomcat中的Filter
  • Tomcat中的pipline-valve
  • springmvc中的Interceptor

BeanFactory中从BeanDefinition到Bean并不是一下子就完成的.这有一个过程.spring正是在这个过程中留下扩展点.来实现BeanDefinition到Bean的过程中的各种自定义变化.

从上面我们得知:AbstractAutowireCapableBeanFactory中有个doCreateBean()正是BeanDefinition到Bean的创建方法.接下来我们看看这个方法.有哪些扩展点:

  1. xxxAware接口:使Bean可以获得xxx. 列如实现了BeanFactoryAware接口的类,可以在该Bean被加载的过程中获取加载该Bean的BeanFactory
  2. BeanPostProcessor:BeanPostProcessor接口定义的两个方法,分别在bean的初始化方法(InitializingBean接口,或者init-method定义)执行的前后执行
  3. InitializingBean接口: 实现了InitializingBean接口的类,执行afterPropertiesSet
  4. 自定义的init-method方法:


总结:


BeanFactory是物料与成品仓库,并配生产线,把BeanDefinition生产成Bean 。BeanFactory留下很多扩展点, 方便开发人员可以参与BeanDefinition到Bean的创建过程.


游客tqcqp5pa4cdy4
目录
相关文章
热爱技术的小郑
|
1月前
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
热爱技术的小郑
31 0
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
热爱技术的小郑
|
1月前
|
XML Java 数据格式
Spring5入门到实战------6、IOC容器-Bean管理XML方式(自动装配)
这篇文章是Spring5框架的入门教程,详细讲解了IOC容器中Bean的自动装配机制,包括手动装配、`byName`和`byType`两种自动装配方式,并通过XML配置文件和Java代码示例展示了如何在Spring中实现自动装配。
热爱技术的小郑
29 1
Spring5入门到实战------6、IOC容器-Bean管理XML方式(自动装配)
热爱技术的小郑
|
1月前
|
XML Java 数据格式
Spring5入门到实战------2、IOC容器底层原理
这篇文章深入探讨了Spring5框架中的IOC容器,包括IOC的概念、底层原理、以及BeanFactory接口和ApplicationContext接口的介绍。文章通过图解和实例代码,解释了IOC如何通过工厂模式和反射机制实现对象的创建和管理,以及如何降低代码耦合度,提高开发效率。
热爱技术的小郑
41 1
Spring5入门到实战------2、IOC容器底层原理
热爱技术的小郑
|
1月前
|
XML Java 数据格式
Spring5入门到实战------8、IOC容器-Bean管理注解方式
这篇文章详细介绍了Spring5框架中使用注解进行Bean管理的方法,包括创建Bean的注解、自动装配和属性注入的注解,以及如何用配置类替代XML配置文件实现完全注解开发。
热爱技术的小郑
48 0
Spring5入门到实战------8、IOC容器-Bean管理注解方式
番茄酱脑袋
|
1月前
|
Java Spring 容器
建模底层逻辑问题之以Spring IOC容器为例,使用因果法建模,如何操作
建模底层逻辑问题之以Spring IOC容器为例,使用因果法建模,如何操作
番茄酱脑袋
24 1
服务端技术栈
|
1月前
|
XML Dubbo Java
Spring之Ioc容器
该文章主要介绍了Spring框架中的IoC(Inversion of Control,控制反转)容器,包括IoC容器的概念、IoC容器在Spring中的实现以及IoC容器的基础包等内容。
服务端技术栈
31 0
Spring之Ioc容器
萝卜丝丸子
|
2月前
|
Java Spring
Spring初始化加速的思路和方案问题之在BeanFactory#doGetBean方法中,栈状态的变化影响bean的初始化的问题如何解决
Spring初始化加速的思路和方案问题之在BeanFactory#doGetBean方法中,栈状态的变化影响bean的初始化的问题如何解决
萝卜丝丸子
34 2
互联网课堂
|
2月前
|
前端开发 Java 应用服务中间件
Spring Boot 2.x 嵌入式 Servlet 容器
Spring Boot使用内嵌Tomcat,默认端口8080,可通过`application.properties`配置端口、上下文路径等。配置方式有两种:1) 直接在配置文件中添加`server.port`和`server.servlet.context-path`;2) 创建`WebServerFactoryCustomizer` Bean来自定义配置,如设置端口`factory.setPort(8083)`,这种方式优先级更高。
互联网课堂
45 0
萝卜丝丸子
|
1月前
|
缓存 Java Maven
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
萝卜丝丸子
33 1
理想shi做条咸鱼
|
2月前
|
Java 测试技术 数据库
Spring Boot中的项目属性配置
本节课主要讲解了 Spring Boot 中如何在业务代码中读取相关配置,包括单一配置和多个配置项,在微服务中,这种情况非常常见,往往会有很多其他微服务需要调用,所以封装一个配置类来接收这些配置是个很好的处理方式。除此之外,例如数据库相关的连接参数等等,也可以放到一个配置类中,其他遇到类似的场景,都可以这么处理。最后介绍了开发环境和生产环境配置的快速切换方式,省去了项目部署时,诸多配置信息的修改。
理想shi做条咸鱼
60 0
云原生

容器服务

热门文章

最新文章

  • 1
    Docker 镜像加速器
  • 2
    Docker CE 镜像源站
  • 3
    Minikube - Kubernetes本地实验环境
  • 4
    Docker的Windows容器初体验
  • 5
    基于Docker的Tensorflow实验环境
  • 6
    Docker常见故障排查指南 - 阿里云容器服务
  • 7
    在阿里云容器服务上开发基于Docker的Spring Cloud微服务应用
  • 8
    使用Delve进行Golang代码的调试
  • 9
    Docker Engine 镜像源站
  • 10
    使用Docker运行Java Web应用
  • 1
    JAVA并发编程ReentrantLock核心原理剖析
    27
  • 2
    有奖评测!容器服务 Kubernetes 版 ACK 文档体验评测等你来
    29
  • 3
    使用 NVIDIA NIM 在阿里云容器服务(ACK)中加速 LLM 推理
    80
  • 4
    容器服务ASK初评
    72
  • 5
    iCraft Editor - 助你轻松绘制出色的立体架构图
    71
  • 6
    如何利用服务网格ASM使用集群外服务做集群内服务的灾备
    95
  • 7
    利用服务网格实现全链路mTLS(二):通过出口网关访问外部mTLS服务
    121
  • 8
    利用服务网格实现全链路mTLS(一):在入口网关上提供mTLS服务
    109
  • 9
    容器化管理ACK
    87
  • 10
    阿里云 ACK 容器服务评测
    146
  • 相关课程

    更多
  • 全面讲解Spring Cloud Alibaba技术栈(知识精讲+项目实战)第三阶段
  • 精通Spring Cloud Alibaba
  • 微服务框架 Spring Cloud 快速入门
  • Java Web开发系列课程 - Spring框架入门
  • Spring Boot 2.5.x开发实战
  • Spring Cloud微服务架构设计与开发实战
  • 相关电子书

    更多
  • 云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第20讲):经典面试题与阿里等名企内部招聘求职面试技巧
  • 微服务架构模式与原理Spring Cloud开发实战
  • 阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库
  • 相关实验场景

    更多
  • 从零搭建Spring Boot的Hello World
  • 使用阿里云容器服务和容器网络文件系统搭建WordPress网站
  • 容器的网络入门
  • 容器的自定义网络
  • 容器的共享网络模型
  • 容器的启动和操作
  • 下一篇
    搭建自己的私有云盘工具总结

    深圳SEO优化公司深圳首页网站关键词优化推广威海响应式网站优化云南包年网站优化临沂网站优化体验连云港网站搜索优化要多少钱网站流量优化工具亳州网站排名优化哪家靠谱海南网站优化电池充电鄂州外包网站优化价格山东网站优化工具诸暨网站优化金阊网站优化公司如何做好一个优化的网站莱芜外贸网站优化推广安庆网站搜索排名优化哪家正规网站优化时间表林州外贸网站优化临沂优化网站界面苏州市网站公告优化如何嘉峪关网站优化推广哪家公司好视频网站SEO优化陕西网站关键词排名优化价格南京如何优化推广网站网站排名优化皆来乐云seo闵行区项目网站优化价格茂名网站优化哪家好呼兰区网站seo优化排名灰色行业怎么优化网站辽宁优化网站公司专门做网站优化公司有哪些歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

    深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化