序言
看了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();
}
}
}