一个简单的Spring容器初始化流程详解
作者:可乐可乐可 发布时间:2023-11-13 02:10:55
前言
首先我们初始化一个最简单的容器,用这个容器研究初始化的流程。
下面就是一个再简单不过的IoC容器了,该容器包含了一个名为beanA的bean,我们初始化容器后,取出该Bean,并调用方法。
public class BeanA {
private String testStr = "Test";
public BeanA(){
System.out.println("Running A");
}
public void sayHello(){
System.out.println("I'm beanA.");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="beanA" class="cn.jirath.learn.spring.BeanA">
</bean>
</beans>
@Test
void testHello(){
Resource springResource=new ClassPathResource("spring-beans.xml");
BeanFactory beanFactory=new XmlBeanFactory(springResource);
BeanA beanA= (BeanA) beanFactory.getBean("beanA");
beanA.sayHello();
}
虽然XmlBeanFactory已经被Spring标记为过时,但是为了达到我们从一个xml定义的bean信息构造一个BeanFactory的目的,勉为其难,还是先用一下233。
这段代码很简单,但是反映了我们使用IoC的一个基础流程:
选择并构建数据源
利用数据源构建一个容器
取出Bean使用
我们就先从这几点一点点讲
在开始之前,需要意识到的是:Spring作为一款优秀的面向对象的框架设计,Spring中采用了大量的设计模式并按照面向对象的逻辑对各个类进行设计,做到了各个类功能单一。
这意味着,Spring的代码会有一种剥洋葱的感觉,子类对双亲扩展,调用默认实现。
选择并构建数据源
构建数据源的部分难度不大,会稍微简单点讲
这里推荐一本书:《Spring源码深度解析(第2版)》
看了Spring的设计,这是真的面向对象。
Spring一开始是使用大量的xml文件配置了容器。从面向对象的角度思考,为了方便使用,需要将各种资源都被抽象出来,先看一下他的资源类结构体系。该部分是系统最底层,在core包中
InputStreamSource封装能返回InputStream的类,可以返回这个流。
日常开发用Spring的体系也会很便捷。
Resource体系达到了这样的目的:对于不同的文件来源都有一种实现来读取该文件,同时,拥有一个规范的接口。
现在我们有了Resource的设计,为了读取对象,Spring提供了BeanDefinitionReader、ResourceLoader来从资源中提取出我们需要的资源内容。这些类的关系如下:
Resource代表一个资源对象
ResourceLoader将文件转化为Resource对象
DocumentLoader将Resource对象转化为Document对象
BeanDefinitionDocumentReader解析Document对象为BeanDefinitions
BeanDefinitionReader抗了初始化的大梁,在new的时候会绑定一个Bean定义注册器(DefaultListableBeanFactory实现了他),后面解析后会用这个注册器注册
这就是大致的一个逻辑,把握住这个大致的逻辑看源码,体验要上升不少
下面是最上方的例子启动的大致的流程,大量的代码在处理读取资源的逻辑
Resource代表一个资源对象
Resource封装为带编码格式的EncodedResource对象
XmlBeanDefinitionReader构建Document对象
XmlBeanDefinitionReader内部有个DocumentLoader,读取Resource对象转化为Document对象
ResourceLoader将文件转化为Resource对象
DocumentLoader将Resource对象转化为Document对象
Document对象转为Element对象
DocumentReader读取Element对象,将信息存储在BeanDefinitionParserDelegate
DocumentReader解析BeanDefinitionParserDelegate为BeanDefinitionHolder
BeanDefinitionHolder获取BeanDefinitions,交给register进行注册(加锁、放map)。
返回注册的数量
这里就是初始化的结果了
总结
来源:https://blog.csdn.net/weixin_44494373/article/details/112974979


猜你喜欢
- java实现数字转大写的方法说明:将数字金额转大写,如下:public class Test { /** *
- 技术要点org.springframework.web.context.request.async.DeferredResult<T&
- 一、问题说明偶然换了下spring boot的版本号,结果idea一直标红,报该父依赖一直找不到。但是当我查看引入的依赖时,版本号已经变成2
- 最新更新的Flyme6整体效果不错,动画效果增加了很多了,看了看flyme6的Viewpager指示器,觉得有点意思,就模仿写了一下,整体效
- disruptor不过多介绍了,描述下当前的业务场景,两个应用A,B,应用 A 向应用 B 传递数据 . 数据传送比较快,如果用http直接
- 其实嵌套滚动已经算一个比较常见的特效了,下面这个动图就是嵌套滚动的一个例子:看到这个动效,大家可能都知道可以用CoordinatorLayo
- 对于随机数,大家都知道,计算机不 可能产生完全随机的数字,所谓的随机数发生器都是通过一定的算法对事先选定的随机种子做复杂的运算,用产生的结果
- 本文实例讲述了C#验证给定字符串形式日期是否合法的方法。分享给大家供大家参考。具体分析如下:这段C#代码用于验证日期的有效性,对于用户输入的
- 介绍跨域CORS,全称是"跨域资源共享"(Cross-origin resource sharing)当页面发出跨域请求
- 如下所示:import java.util.Scanner;public class Main{public static void mai
- 泛型的概述和优势泛型概述泛型:是JDK5中引入的特性,可以在编译阶段约束操作的数据类型,并进行检查。泛型的格式:<数据类型>;
- java String的深入理解一、Java内存模型 按照官方的说法:Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和
- 手头项目需要抓取一个用js渲染出来的网站中的数据。使用常用的httpclient抓回来的页面是没有数据。上网百度了一下,大家推荐的方案是使用
- 在实际应用中,很可能我们希望自己的app在按下返回键的时候并不退出,而是像按home键一样仅仅返回桌面,而程序仍然在后台运行着。要怎么实现这
- Spring Boot简介Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开
- FeignClient接口调用无参字符串参数对象参数拟定客户端调用服务端接口,直接放代码啦,参考格式即可。1、无参服务端方法:
- android开发中为activity增加左右手势识别,如右滑关闭当前页面。/* * for左右手势 *&n
- 只需要下载相应的zip包,不需装什么手机助手。1、下载相应zip包(ROM)http://download.mokeedev.com/比如我
- 有时候数据库文档需要整理,可是只能手动的复制粘贴,心中一万只草泥马奔腾而过。。。screw简洁好用的数据库表结构文档生成工具。1. 创建项目
- 本文实例为大家分享了android自定义WaveView水波纹控件的使用方法,供大家参考,具体内容如下Github Repository a