Spring源码阅读(一)

初始化流程

1、spring容器的初始化时,通过this()调用了无参构造函数,主要做了以下三个事情:

(1)实例化BeanFactory【DefaultListableBeanFactory】工厂,用于生成Bean对象
(2)实例化BeanDefinitionReader注解配置读取器,用于对特定注解(如@Service、@Repository)的类进行读取转化成 BeanDefinition 对象,(BeanDefinition 是 Spring 中极其重要的一个概念,它存储了 bean 对象的所有特征信息,如是否单例,是否懒加载,factoryBeanName 等)
(3)实例化ClassPathBeanDefinitionScanner路径扫描器,用于对指定的包目录进行扫描查找 bean 对象

主要方法

1 refresh()

我们需要记住:Spring 中的每一个容器都会调用 refresh 方法进行刷新,无论是 Spring 的父子容器,还是 Spring Cloud Feign 中的 feign 隔离容器,每一个容器都会调用这个方法完成初始化。

public void refresh() throws BeansException, IllegalStateException {
	synchronized (this.startupShutdownMonitor) {
		// Prepare this context for refreshing.
		// 1. 刷新前的预处理
		prepareRefresh();

		// Tell the subclass to refresh the internal bean factory.
		// 2. 获取 beanFactory,即前面创建的【DefaultListableBeanFactory】
		ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

		// Prepare the bean factory for use in this context.
		// 3. 预处理 beanFactory,向容器中添加一些组件
		prepareBeanFactory(beanFactory);

		try {
			// Allows post-processing of the bean factory in context subclasses.
			// 4. 子类通过重写这个方法可以在 BeanFactory 创建并与准备完成以后做进一步的设置
			postProcessBeanFactory(beanFactory);

			// Invoke factory processors registered as beans in the context.
			// 5. 执行 BeanFactoryPostProcessor 方法,beanFactory 后置处理器
			invokeBeanFactoryPostProcessors(beanFactory);

			// Register bean processors that intercept bean creation.
			// 6. 注册 BeanPostProcessors,bean 后置处理器
			registerBeanPostProcessors(beanFactory);

			// Initialize message source for this context.
			// 7. 初始化 MessageSource 组件(做国际化功能;消息绑定,消息解析)
			initMessageSource();

			// Initialize event multicaster for this context.
			// 8. 初始化事件派发器,在注册监听器时会用到
			initApplicationEventMulticaster();

			// Initialize other special beans in specific context subclasses.
			// 9. 留给子容器(子类),子类重写这个方法,在容器刷新的时候可以自定义逻辑,web 场景下会使用
			onRefresh();

			// Check for listener beans and register them.
			// 10. 注册监听器,派发之前步骤产生的一些事件(可能没有)
			registerListeners();

			// Instantiate all remaining (non-lazy-init) singletons.
			// 11. 初始化所有的非单实例 bean
			finishBeanFactoryInitialization(beanFactory);

			// Last step: publish corresponding event.
			// 12. 发布容器刷新完成事件
			finishRefresh();
		}

		...
		
	}
}

2 obtainFreshBeanFactory()

1 实例化BeanFactory【DefaultListableBeanFactory】工厂,用于生成Bean对象;
2:初始化BeanDefinitionReader并从xml加载bean的定义信息

在这里插入图片描述
在这里插入图片描述

2.1: loadBeanDefinitions();

1 加载bean的定义的信息到BeanFactory中的beanDefinitionNames中
在这里插入图片描述
在这里插入图片描述

3 finishBeanFactoryInitialization(beanFactory);

1 初始化所有非单例Bean

实例化Bean

3.1 beanFactory.preInstantiateSingletons();

1 完成单例对象的创建
在这里插入图片描述

3.2 CreateBean()

在这里插入图片描述

3.3 doCreateBean()

在这里插入图片描述

3.4 CreateBeanInstance()

1 此方法中instanitiateBean()方法是实例化bean的主要方法
在这里插入图片描述

3.5 instantiateBean()

1 通过默认的构造器进行实例化Bean对象
在这里插入图片描述

3.6 instantiate()

1 clazz.getDeclaredConstructor();通过反射获取构造器
在这里插入图片描述

3.7 instantiateClass()

1 ctor.newInstance()//反射实例化Bean
在这里插入图片描述

3.8 doCreateBean()

回到doCreateBean方法中当前Bean已经实例化,继续向下执行
1 pupulateBean() 给Bean填充属性
2 initializeBean() 初始化Bean

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值