0.总述
- 创建一个对象并加入到spring容器的过程基本可以分为三个大的步骤,一是加载整个环境信息,二是加载各个bean的定义,接着就是创建对应的bean,放入ioc容器中。
- spring创建bean最核心方法就是org.springframework.context.support.AbstractApplicationContext#refresh方法,这个方法完成了spring框架中bean的整个创建过程,包括前处理后处理,aop代理,bean创建完成或者修改后的通知等等,简简单单的一个方法就包罗万象,spring的ioc精髓全在其中
1.从方法中的方法说起--->refresh()
-
总的逻辑还是没变,优先加载环境和配置,其次将优先级高的bean先放入容器,比如【BeanFactoryPostProcessor bean】【BeanPostProcessor bean】等等,在创建bean的时候将会使用这优先配置的bean对后续的bean进行处理
```
synchronized (this.startupShutdownMonitor) {
StartupStep contextRefresh = this.applicationStartup.start("spring.context.refresh");
// Prepare this context for refreshing.
// 1.为上下文的刷新做准备,包括设置【启动时间,上下文启动标志设置true,初始化环境属性以及验证必需属性
// Local listeners registered 注册,earlyApplicationEvents事件重置
prepareRefresh();
// Tell the subclass to refresh the internal bean factory.
// 告诉子类刷新内部 Bean 工厂
// 存在工厂就关闭,重新新建一个,并加载解析并注册bean定义
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// Prepare the bean factory for use in this context.
// bean工厂【类加载器设置、一些单例优先注册到容器中,一些BeanPostProcessor放入
prepareBeanFactory(beanFactory);
try {
// Allows post-processing of the bean factory in context subclasses.
// 子类覆盖方法做额外的处理,此处我们自己一般不做任何扩展工作,但是可以查看web中的代码是有具体实现的
postProcessBeanFactory(beanFactory);
StartupStep beanPostProcess = this.applicationStartup.start("spring.context.beans.post-process");
// Invoke 【factory processors】 registered as beans in the context.
// 实例化并调用所有注册的 BeanFactoryPostProcessor bean,如果给定,则遵守显式顺序。
invokeBeanFactoryPostProcessors(beanFactory);
// Register bean processors that intercept bean creation.
// 实例化并注册所有 BeanPostProcessor bean,如果给定,则遵循显式顺序。
registerBeanPostProcessors(beanFactory);
beanPostProcess.end();
// Initialize message source for this context.
// 为上下文初始化message源,即不同语言的消息体,国际化处理,
initMessageSource();
// Initialize event multicaster for this context.
// 初始化事件监听器多路广播器。如果上下文中未定义任何内容,则使用 SimpleApplicationEventMulticaster
initApplicationEventMulticaster();
// Initialize other special beans in specific context subclasses.
// 留给子类来初始化其他的bean--springboot内置tomcat在这里实现了
onRefresh();
// Check for listener beans and register them.
// 在所有注册的bean中查找listener bean,注册到消息广播器中
registerListeners();
// Instantiate all remaining (non-lazy-init) singletons.
// 实例化剩下的单实例(非懒加载的)---》核心方法
**finishBeanFactoryInitialization(beanFactory);**
// Last step: publish corresponding event.
// 发布相应事件
finishRefresh();
}
......
}
```