我准备战斗到最后,不是因为我勇敢,是我想见证一切。 --双雪涛《猎人》
[TOC]
Thinking
- 一个技术,为什么要用它,解决了那些问题?
- 如果不用会怎么样,有没有其它的解决方法?
- 对比其它的解决方案,为什么最终选择了这种,都有何利弊?
- 你觉得项目中还有那些地方可以用到,如果用了会带来那些问题?
- 这些问题你又如何去解决的呢?
本文主要基于 Spring 5.2.7.BUILD-SNAPSHOT
春天这么春天,冬天还会远吗?Fuker!!!
提到Spring 总是第一时间想到它的集大成者,优雅且高效,提供的各种好用的功能,Ioc,DI等。
其实看似非常智能的
Spring
,做的每一步,都是各种代码配合着,勤勤恳恳的在底层工作着。
1、Spring核心组件装配流程解析
首先思考一下,Spring要想实现所有的功能。如果是你,具体要做什么,
- 首先要读取配置文件吧(不管是xml还是注解,都要获取到该读取的配置文件吧!)
- 读取到配置文件之后呢?要加载解析吧
- 解析完成,才能做具体的操作吧
那么来看看spring具体的做法鸭!!!
1.1、Spring核心组件装配流程文字解释
- 需要将bean的定义信息声明在Spring的配置文件中。(运行代码之前)
- 需要通过Spring抽象出各种Resource来指定对应的配置文件。
- 需要显式申明一个Spring工厂,该工厂用来掌控我们在配置文件中锁声明的各种bean以及bean之间的依赖关系与注入关系
- 需要定义一个配置信息读取器,该读取器用来读取之前所定义的bean配置文件信息
- 读取器的作用是读取我们所声明的配置文件信息,并且将读取后的信息装配到之前所有声明的工厂当中
- 需要将读取器与工厂以及资源对象进行相应的关联处理。
- 工厂管理的全部对象装配完毕,可以供客户端直接调用,获取客户端想要使用的各种bean对象
总结为一下三个步骤
- 资源抽象
- 工厂
- 配置信息读取器
Spring 将上述的所有功能都抽取出来,在
2001
年的时候就有如此优秀且先进的想法真的牛!spring 最顶层的抽象 :
org.springframework.beans.factory.BeanFactory
类似于java中的java.lang.Object
Spring 的 资源访问 顶层接口:{@link Resource}
1.2、思想落地到代码上
使用的
xml
的方式
// 获取 xml文件,创建获取资源文件
Resource resource = new ClassPathResource("applicationContext.xml");
// 很早之前是使用xmlBeanFactory, 因为这种工厂spring意识到功能太单一了。
//XmlBeanFactory xmlBeanFactory = new XmlBeanFactory(resource);
// spring中一般都是使用工厂来加载文件的
DefaultListableBeanFactory defaultListableBeanFactory = new DefaultListableBeanFactory();
BeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(defaultListableBeanFactory);
beanDefinitionReader.loadBeanDefinitions(resource);
// 上述所有的步骤是完成了 资源的解析,工厂的装配
// 下面的步骤就是使用工厂 提取具体的bean信息
Student student = (Student) defaultListableBeanFactory.getBean("student");
System.out.println(student);
- 在后面,会围绕着上面简单的代码,逐步的分析
Spring
的底层源码。 - 建议阅读
《Spring源码深度解析 2》
本文仅供笔者本人学习,一起进步!
加油!