Spring源码学习(一)

导读:本篇文章讲解 Spring源码学习(一),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

第一章:初识Spring



读取源码的通用方法:
1、ctrl+F12:查看类中方法
2、ctrl+H:查看该类的继承类
3、可以右键查看继承树:先查询抽象类或者接口,掌握大方向,再扣细节
3、ctrl+N:查询到类的位置

源码构建参考:https://www.zhihu.com/question/483901712

一、spring架构原理图

在这里插入图片描述
图片解读:
读取资源文件=》生成BeanDefinition(bean定义信息)=》根据bean定义信息生成bean

二、spring核心接口的分析

  • 基础接口
    Resource(1、有资源)+ ResourceLoader (2、资源加载)
    BeanDefinitionReader(3、读取的资源转化为bean定义信息)
    BeanDefinition(4、bean定义信息)
    BeanDefinitionRegistry(5、将bean定义信息放到档案馆中)
    BeanFactory(6、在档案馆中取图纸交给bean工厂造东西)

ApplicationContext
Aware

  • 生命周期-后置处理器
    BeanFactoryPostProcessor
    InitializingBean
    BeanPostProcessor

1、Resource(有资源)

各种资源以资源流的方式被读取
在这里插入图片描述

2、ResourceLoader (读取资源)

这是个策略接口
在这里插入图片描述
通过getResource取加载策略
在这里插入图片描述
策略模式
在这里插入图片描述

3、BeanFactory

1、bean工厂的继承图
在这里插入图片描述
BeanFactory下面有三大工厂

  • HierarchicalBeanFactory:定义父子工厂(父子容器)
  • ListableBeanFacotory:的实现是DefaultListableBeanFactory,保存了ioc容器中的核心信息
  • AutowireCapableBeanFactory:提供自动装配能力
    AnnotationApplicationContext组合了档案馆,他有自动装配能力。

2、对ListableBeanFactory分析
在这里插入图片描述
3、分析上面的策略模式(AbstractApplicationContext)

	/**
	 * ResourcePatternResolver used by this context.
	 */
	// 策略模式的环境类
	private ResourcePatternResolver resourcePatternResolver;

	/**
	 * Create a new AbstractApplicationContext with no parent.
	 */
	public AbstractApplicationContext() {
		this.resourcePatternResolver = getResourcePatternResolver();
	}

4、DefaultListableBeanFactory工厂中的很多池缓存功能很重要

4、BeanDefinition(bean的定义信息)

5、BeanFactory的子接口DefaultListBeanFactory

1、通过XML的bean注入的方式,跟踪堆栈(给DefaultListBeanFactory的存放map的地方大断点)

this.beanDefinitionMap.put(beanName, beanDefinition);

在这里插入图片描述

2、使用XML的方式,模拟创建bean,来跟踪堆栈查看源码

<?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 class="com.future.end.bean.Person" id="person">
		<property name="name" value="刘阿三气shi人"/>
		<property name="id" value="13"/>
	</bean>
</beans>

3、主类入口直接使用xml注入

public class MainTest {
	public static void main(String[] args) {
		// 通过配置文件创建bean
		ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("beans.xml");
		Person bean = classPathXmlApplicationContext.getBean(Person.class);
		System.out.println(bean);
	}
}

4、跟踪堆栈
在这里插入图片描述

5、整个堆栈流程
在这里插入图片描述

6、BeanDefinitionRegistry接口,这个是DefaultListableBeanFactory的父接口

1、由上可知,beanDefinition(bean定义信息)就放在BeanDefinitionRegistry中

7、ApplicationContext(IOC容器)

在这里插入图片描述
1、ioc事件派发器
2、国际化解析
3、bean工厂功能—自动装配被组合进来的
4、资源解析功能

8、初识xxxAware接口

1、可能项目中想用到一些spring的Aware接口,那就可以通过spring提供的接口,实现其回调方法

在这里插入图片描述
2、aware接口被调用的流程
在这里插入图片描述

三、总结

1、spring总体架构:

1、资源文件=》2、被资源读取器读取=》3、将读取出来的资源,封装成Beanfinition=》4、将bean定义信息放到档案馆中(BeanDefinitionRegistry,实际是DefaultListableBeanFactory中的一个map)=》5、定义信息准备好之后开始按照定义信息,调用构造器创建一个bean=》6、调用一写aware后置处理器去给bean赋值【注:这里可能有错误,第二章将继续学习讲解】

2、将核心接口串联起来

按照第二节,和总体架构串联一下即可


参考:

  • 雷丰阳老师spring源码课程讲解
  • spring官方源码
    =========================》甲乙 2022.08.25

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/96197.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!