欢迎光临
我们一直在努力

Spring源码分析

Spring源码

Spring的执行流程:

Spring源码分析

beanDefinitionReader是一个简单的接口,是用于读取Spring配置文件的内容,并转换为BeanDefinition。

- PropertiesBeanDefinitionReader:是一个具体实现类,可以从properties文件读取Bean定义信息。 - XmlBeanDefinitionReader:具体实现类,可以从XML文件读取Bean定义信息。

BeanDefinition:存储bean的信息,

beanfactoryPostProcessor: 加载配置文件的时候不会进行值的替换,这时需要调用BeanFactory的后置处理器做一些字符替换

map结构存储bean

beanFactory:定义获取bean及bean的各种属性,提供访问bean容器的入口。(等同于容器,操作beanfactory等于操作容器)

Spring核心源码(包含13个方法):

@Override public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { // 准备此上下文以进行刷新。 //设置容器创建时间,和一些空集合 prepareRefresh(); ​ // 告诉子类刷新内部 bean 工厂。 //先创建beanFactory (DefaultListableBeanFactory beanFactory = createBeanFactory();) //调用loadBeanDefinitions(beanFactory);使用BeanDefinitionReader读取配置文件 //从配置文件加载bean的定义信息封装成一个集合,保存到BeanDefinition中 ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); // 准备在此上下文中使用的bean工厂 //(此时容器中除了一些bean信息,然后是空的)所以要给bean工厂设置一些属性值 prepareBeanFactory(beanFactory); ​ try { // 允许在上下文子类中对bean工厂进行后处理。 //空,留给子类扩展使用 postProcessBeanFactory(beanFactory); ​ // 调用在上下文中注册为bean的工厂处理器。 //实例化并调用所有已注册的 BeanFactoryPostProcessor //( 准备工作:准备beanPostProcessor,准备监听器事件,广播器) invokeBeanFactoryPostProcessors(beanFactory); ​ //实例化并注册所有 BeanPostProcessor bean,如果给定 //则尊重显式顺序。 <p>必须在应用程序 bean 的任何实例化之前调用 //注册拦截bean创建的bean处理器 1.registerBeanPostProcessors(beanFactory); ​ // 为此上下文初始化消息源。 //国际化的一些操作 2.initMessageSource(); ​ // 为此上下文初始化事件多播器 3.initApplicationEventMulticaster(); ​ // 初始化特定上下文子类中的其他特殊 bean。 //空 4.onRefresh(); ​ //检查侦听器 bean 并注册它们。 5.registerListeners(); ​ 1-5 实例化前的准备工作 //实例化所有剩余的(非惰性初始化)单例。 finishBeanFactoryInitialization(beanFactory); (doCreateBean:通过反射创建对象 constructor=class.getDeclaredConstructor(), constructor.newinstance() 此时的bean实例属性值为空) ​ // 最后一步:发布相应的事件 finishRefresh(); } ​ catch (BeansException ex) { if (logger.isWarnEnabled()) { logger.warn("Exception encountered during context initialization - " + "cancelling refresh attempt: " + ex); } ​ // 销毁已经创建的单例以避免悬空资源 destroyBeans(); ​ // 重置“活动”标志。 cancelRefresh(ex); ​ // Propagate exception to caller. throw ex; } ​ finally { //重置 Spring 核心中的常见自省缓存,因为我们可能不再需要单例 bean 的元数据...... resetCommonCaches(); } } } ​

Spring加载配置文件到应用程序:调用loadBeanDefinitions(beanFactory);使用BeanDefinitionReader读取配置文件

解析工作(解析bean标签的各种其他属性,解析构造函数参数,解析property元素等)

Spring源码分析

bean的生命周期

Spring源码分析

spring容器按照使用者可以分为几类:

1.自定义对象

2.容器对象

Spring源码分析

如果想要在自定义对象中获取容器对象,则需要实现BeanFactoryAware, ApplicationContextAware接口

容器调用invokeAware方法,调用aware接口处理器的一些方法实现注入.

aware接口:

ApplicationContextAware:

Spring源码分析

BeanFactoryAware:

Spring源码分析

BeanPostProcessor:处理器 主要实现 aop(动态代理)

前置处理器

Spring源码分析

后置处理器

Spring源码分析

容器和对象的创建流程: ​ • 1.先创建容器(创建容器之前调用prepareRefresh()方法做一些准备工作(设置容器的启动时间,设置活跃状态为true,关闭状态为false和创建一堆空集合)) ​ • 2.加载配置文件,封装成BeanDinition ​ • 3.调用执行beanFactoryPostProcessor ( 准备工作:准备beanPostProcessor,准备监听器事件,广播器) • 4.实例化 ​ • 5.初始化 ​ • 6.获取完整对象

  • 海报
海报图正在生成中...
赞(0) 打赏
声明:
1、本博客不从事任何主机及服务器租赁业务,不参与任何交易,也绝非中介。博客内容仅记录博主个人感兴趣的服务器测评结果及一些服务器相关的优惠活动,信息均摘自网络或来自服务商主动提供;所以对本博客提及的内容不作直接、间接、法定、约定的保证,博客内容也不具备任何参考价值及引导作用,访问者需自行甄别。
2、访问本博客请务必遵守有关互联网的相关法律、规定与规则;不能利用本博客所提及的内容从事任何违法、违规操作;否则造成的一切后果由访问者自行承担。
3、未成年人及不能独立承担法律责任的个人及群体请勿访问本博客。
4、一旦您访问本博客,即表示您已经知晓并接受了以上声明通告。
文章名称:《Spring源码分析》
文章链接:https://www.456zj.com/36509.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址