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

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器镜像服务 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之间的依赖
相关文章
|
20天前
|
监控 网络协议 Java
Tomcat源码解析】整体架构组成及核心组件
Tomcat,原名Catalina,是一款优雅轻盈的Web服务器,自4.x版本起扩展了JSP、EL等功能,超越了单纯的Servlet容器范畴。Servlet是Sun公司为Java编程Web应用制定的规范,Tomcat作为Servlet容器,负责构建Request与Response对象,并执行业务逻辑。
Tomcat源码解析】整体架构组成及核心组件
|
5天前
|
存储 缓存 Java
什么是线程池?从底层源码入手,深度解析线程池的工作原理
本文从底层源码入手,深度解析ThreadPoolExecutor底层源码,包括其核心字段、内部类和重要方法,另外对Executors工具类下的四种自带线程池源码进行解释。 阅读本文后,可以对线程池的工作原理、七大参数、生命周期、拒绝策略等内容拥有更深入的认识。
什么是线程池?从底层源码入手,深度解析线程池的工作原理
|
5天前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
|
9天前
|
开发工具
Flutter-AnimatedWidget组件源码解析
Flutter-AnimatedWidget组件源码解析
|
27天前
|
测试技术 Python
python自动化测试中装饰器@ddt与@data源码深入解析
综上所述,使用 `@ddt`和 `@data`可以大大简化写作测试用例的过程,让我们能专注于测试逻辑的本身,而无需编写重复的测试方法。通过讲解了 `@ddt`和 `@data`源码的关键部分,我们可以更深入地理解其背后的工作原理。
23 1
|
25天前
|
监控 API 开发者
深入解析Docker容器的生命周期
【8月更文挑战第24天】
11 0
|
28天前
|
测试技术 持续交付 数据库
容器镜像解析问题之区分单元测试和集成测试如何解决
容器镜像解析问题之区分单元测试和集成测试如何解决
13 0
|
28天前
|
Java 测试技术 数据库
容器镜像解析问题之解析 Java 应用依赖时识别 jar 包如何解决
容器镜像解析问题之解析 Java 应用依赖时识别 jar 包如何解决
15 0
|
28天前
|
存储 容器
容器镜像解析问题之desc.Image() 方法确定返回的 Image 接口类型如何解决
容器镜像解析问题之desc.Image() 方法确定返回的 Image 接口类型如何解决
13 0
|
1月前
|
存储 NoSQL Redis
redis 6源码解析之 object
redis 6源码解析之 object
53 6

推荐镜像

更多