SpringIOC源码解析(2)—— 简单容器

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: BeanFactory 和 FactoryBean 的区别BeanFactory源码BeanFactory家族体系其他术语

首先要明确两点:


所有的IOC接口都要实现接口BeanFactory。

IOC容器的设计主要分为两个主要路线:BeanFactory和ApplicationContext分别为核心。


BeanFactory 和 FactoryBean 的区别


前者是spring的根接口,定义了Bean工厂最基础的功能特性,是一个Factory

后者是用来生成普通的bean,实现了这个接口之后,spring会在容器初始化时会把实现了这个接口的bean取出来,然后通过getObject()方法来生成bean。(根据该Bean的Id从BeanFactory中获取的实际上是FactoryBean的getObject()返回的对象,而不是FactoryBean本身, 如果要获取FactoryBean对象,可以在id前面加一个&符号来获取)

]

<bean id="userFactoryBean" class="com.wjw.entity.factory.UserFactoryBean"/>


// 根据FactoryBean创建的对象
User user4a = (User) applicationContext.getBean("userFactoryBean");
User user4b = (User) applicationContext.getBean("userFactoryBean");
System.out.println("FactoryBean创建的对象:" + user4a);
System.out.println("FactoryBean创建的对象:" + user4b);

上面代码获取到的是User对象


22.png

加上转义字符FACTORY_BEAN_PREFIX = "&"


UserFactoryBean user4a = (UserFactoryBean) applicationContext.getBean("&userFactoryBean");
UserFactoryBean user4b = (UserFactoryBean) applicationContext.getBean("&userFactoryBean");
System.out.println("FactoryBean创建的对象:" + user4a);
System.out.println("FactoryBean创建的对象:" + user4b);

打印的就是UserFactoryBean对象


BeanFactory源码


上面提到的转义字符&:

25.png


26.png27.png


@Autowired按类型获取实例,@Qualifier支持按名字获取实例,最终都是调用的这些方法。


28.png29.png30.png31.png


可以看到BeanFactory只对IOC容器的基本行为做了定义,并不关心是怎么生成bean的。


BeanFactory家族体系


32.png


根据单一职责原则,较顶层的接口一般都实现了单一职责。


ListableBeanFactory该接口可以以列表的方式提供bean的相关信息,特点是可以批量列出工厂生产的实例的信息。


33.png34.png35.png


AutowireCapableBeanFactory该类可以填充那些不受Spring控制的类,实现了这个接口的,诸如AbstractAutowireCapableBeanFactory便可以使用其autowireBean方法中的populateBean方法来装配特定的Spring Bean实例来满足业务需求。


36.png


一般在代码中不建议直接使用这个接口


在代码中一般直接使用@Autowired注解,这个注解最终调用的还是AutowireCapableBeanFactory的resolveDependency方法来实现的依赖注入,AutowireCapableBeanFactory定义了三种装配策略:


37.png


ConfigurableBeanFactory


38.png


39.png


040.png


41.png


该接口继承了SingletonBeanRegistry,所以也具备向容器注册单例实例的功能。


ConfigurableListableBeanFactory接口继承了BeanFactory体系的所有二级接口(集大成者),包含该体系的所有方法,还加入了忽略自动装配等10个方法


42.png

DefaultListableBeanFactory最主要是实现了BeanDefinitionRegistry,是BeanDefinition注册的重点

一个最重要的属性,存储spring中对bean的定义和描述:BeanDefinition


43.png


其他术语


  • 组件扫描:自动发现应用容器中需要创建的Bean
  • 找出被Controller、Service、Repository等注解标签标记的bean
  • 自动装配:自动满足Bean之间的依赖
相关文章
|
3月前
|
Kubernetes Cloud Native 持续交付
Docker:轻量级容器化技术解析
Docker:轻量级容器化技术解析
|
5月前
|
存储 缓存 安全
Java 集合容器常见面试题及详细解析
本文全面解析Java集合框架,涵盖基础概念、常见接口与类的特点及区别、底层数据结构、线程安全等内容。通过实例讲解List(如ArrayList、LinkedList)、Set(如HashSet、TreeSet)、Map(如HashMap、TreeMap)等核心组件,帮助读者深入理解集合容器的使用场景与性能优化。适合准备面试或提升开发技能的开发者阅读。
95 0
|
7月前
|
弹性计算 Java Maven
从代码到容器:Cloud Native Buildpacks技术解析
Cloud Native Buildpacks(CNB)是一种标准化、云原生的容器镜像构建系统,旨在消除手动编写Dockerfile,提供可重复、安全且高效的构建流程。它通过分层策略生成符合OCI标准的镜像,实现应用与基础镜像解耦,并自动化依赖管理和更新。阿里云应用管理支持通过CNB技术一键部署应用至ECS,简化构建和运行流程。
|
8月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
771 29
|
8月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
252 4
|
8月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
8月前
|
移动开发 前端开发 JavaScript
从入门到精通:H5游戏源码开发技术全解析与未来趋势洞察
H5游戏凭借其跨平台、易传播和开发成本低的优势,近年来发展迅猛。接下来,让我们深入了解 H5 游戏源码开发的技术教程以及未来的发展趋势。
|
8月前
|
存储 前端开发 JavaScript
在线教育网课系统源码开发指南:功能设计与技术实现深度解析
在线教育网课系统是近年来发展迅猛的教育形式的核心载体,具备用户管理、课程管理、教学互动、学习评估等功能。本文从功能和技术两方面解析其源码开发,涵盖前端(HTML5、CSS3、JavaScript等)、后端(Java、Python等)、流媒体及云计算技术,并强调安全性、稳定性和用户体验的重要性。
|
9月前
|
机器学习/深度学习 自然语言处理 算法
生成式 AI 大语言模型(LLMs)核心算法及源码解析:预训练篇
生成式 AI 大语言模型(LLMs)核心算法及源码解析:预训练篇
2012 1
|
8月前
|
负载均衡 JavaScript 前端开发
分片上传技术全解析:原理、优势与应用(含简单实现源码)
分片上传通过将大文件分割成多个小的片段或块,然后并行或顺序地上传这些片段,从而提高上传效率和可靠性,特别适用于大文件的上传场景,尤其是在网络环境不佳时,分片上传能有效提高上传体验。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

推荐镜像

更多
  • DNS