Spring源码分析

序言

看了spring源码,把高内聚,低耦合,设计模式,对象多态,接口实现,类的继承以及框架的扩展性运用的淋漓尽致,希望你看了,颇有收获

1. 定义

Spring 使创建 Java 企业应用程序变得容易。 它提供了在企业环境中使用 Java 语言所需的一切,支持 Groovy 和
Kotlin 作为 JVM 上的替代语言,并且可以根据应用程序的需要灵活地创建多种架构。 从 Spring Framework 6.0
开始,Spring 需要 Java 17

spring官网链接:https://spring.io/

2. 架构

在这里插入图片描述

3. 业务逻辑架构图

在这里插入图片描述

4. IOC

在这里插入图片描述

4.1配置文件

  • 解析
    类路径bean配置文件-resource-encode-inputStrem-inputSource-document
  • 加载
    放入beandifinitionMap(beanName,difinition)

4.2bean生命周期

  • 通过反射实例化对象
  • 填充属性
    这里会涉及到循环依赖(只针对单例,set注入)

1.spring设计三级缓存

singlelonObject(完整对象)
一级缓存
erlysinglelonObject
二级缓存(早期暴露对象)
singlelonFactory(对象object工厂代理对象)
三级缓存

2.缓存依赖过程

1、A创建实例,生成一个singletonFactory对象存到三级缓存,
2、A属性填充时,发现需要B
3、然后调用B的CreateBean方法,创建实例B,B的singletonFactory对象存到三级缓存
4、B属性填充,B里面需要A,然后通过三级缓存里面找,发现有,通过getObject得到A的实例对象引用,在存到二级缓存里面去,注意这里是A的实例对象,和前面A创建的实例对象是同一个,没有走AOP
5、因为是普通实例,所以B执行后置处理器,不走AOP,返回的依旧是普通的实例,再把B从三级缓存中移除,存到一级缓存里面
6、再回到A,此时A调用getBean就可以返回B的实例对象,这个时候,B已经在1级缓存,A还在二级缓存里面。
7、A的属性填充完之后,调用初始化方法,走后置处理器,因为不是AOP所以初始化之后得到的A还是普通实例
8、在接着走getSingleton(false)方法,这个时候A已经被丢到了二级缓存,所以getSingleton也会拿到对象,但是这里拿到的对象和A一开始实例化的对象是一样的。

9、最后再把A塞到1级缓存,从二级缓存中移除

  • 初始化对象

1.setAware接口 通过实现该类接口,可以获取容器
2.后置处理器 @postcust @initBean @inti-method 事务与AOP是放在后置处理器后面执行处理的

  • 销毁对象

5.扩展(ClassPathXmlApplicationContext)

在这里插入图片描述

public void refresh() throws BeansException, IllegalStateException {
		synchronized (this.startupShutdownMonitor) {
			//1:准备刷新上下文环境
			prepareRefresh();

			//2:获取告诉子类初始化Bean工厂
			ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

			//3:对bean工厂进行填充属性
			prepareBeanFactory(beanFactory);

			try {
				// 第四:留个子类去实现该接口
				postProcessBeanFactory(beanFactory);

				// 调用我们的bean工厂的后置处理器.
				invokeBeanFactoryPostProcessors(beanFactory);

				// 注册我们bean的后置处理器
				registerBeanPostProcessors(beanFactory);

				// 初始化国际化资源处理器.
				initMessageSource();

				// 创建事件多播器
				initApplicationEventMulticaster();

				// 这个方法同样也是留个子类实现的springboot也是从这个方法进行启动tomcat的.
				onRefresh();


				//把我们的事件监听器注册到多播器上
				registerListeners();

				//实例化我们剩余的单实例bean.
				finishBeanFactoryInitialization(beanFactory);

				// 最后容器刷新 发布刷新事件(Spring cloud也是从这里启动的)
				finishRefresh();
			}

			catch (BeansException ex) {
				if (logger.isWarnEnabled()) {
					logger.warn("Exception  encountered during context initialization - " +
							"cancelling refresh attempt: " + ex);
				}

				// Destroy already created singletons to avoid dangling resources.
				destroyBeans();

				// Reset 'active' flag.
				cancelRefresh(ex);

				// Propagate exception to caller.
				throw ex;
			}

			finally {
				// Reset common introspection caches in Spring's core, since we
				// might not ever need metadata for singleton beans anymore...
				resetCommonCaches();
			}
		}
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我叫果冻

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值