Spring容器创建过程
Spring容器的refresh() 创建刷新
1 prepareRefresh() 刷新前的预处理
1) initProPertySources() 初始化一些属性设置; 子类定义个性化的属性设置方法
2) getEnvironment( ) .validateRequiredProperties() 检验属性的合法性
3)earlyApplicationEvents = new LinkedHashSet<ApplicationEvent>(); 保存容器中的一些早期的事件
2 obtainFreshBeanFactory() 获取BeanFactory
1)refreshBeanFactory() 刷新(创建) BeanFactory
创建了一个this.beanFactory = new DefaultListableBeanFactory()
2) getBeanFactory() 返回刚才GenericApplicationContext 创建的BeanFactory对象
3) 将创建的BeanFactory(DefaultListableBeanFactory)返回
3 prepareBeanFactory(beanFactory); BeanFactory的预准备工作(BeanFactory进行一些设置)
1 设置BeanFactory 的类加载器、支持表达式解析器
2 添加部分BeanPostProcessor[ApplicationContextAwareProcessor]
3 设置忽略的自动装配的接口 EnvironmentAware、 EmbeddedValueResolverAware
4 注册可以解析的自动装配。 直接在任何组件中自动注入: BeanFactory、 ResourceLoader、ApplicationEventPublisher、ApplicationContext
5 添加BeanPostProcessor【ApplicationListenerDetector功能的Processor】
6 添加编译时的AspectJ
7 给BeanFactory中注册有些能用的组件
environment【ConfigurableEnvironmetn】
systemProperties 【Map<String, Object>】
systemEnvironment 【Map<String, Object>】]
4 PostProcessoBeanFactory(BeanFactory) BeanFactory准备工作完成后进行的后置处理工作
1) 子类通过重写这个方法来在BeanFactory创建并又准备完成以后做进一步的设置
到此为止 BeanFactory创建及其预准备工作完成
7 initMessageSource() 初始化MessageSource组件(做国际化功能,消息绑定,消息解析)
1) 获取BeanFactory
2) 看容器是否有id 为messageSource的 类型是MessageSource的组件
如果有赋值给messageSource 如果没有自己创建一个DelegatingMessageSource
MessageSource去除估计会配置文件中的某个key值,能按照区域信息获取
3) 把创建好的MessageSource注册在容器中 以后获取国际化配置文件的值的时候,自动注入MessageSource
8 initApplicationEventMulticaster() 初始化时间派发器
1) 获取BeanFactory
2) 从BeanFactory中获取applicationEventMulticaster的ApplicationEventMulticaster
3) 如果上一步没有配置,创建一个SimpleApplicationEventMulticaster
4) 将创建的ApplicationEventMulticaster添加到BeanFactory中,以后其他组件直接注入
9 onRerresh() 留给容器(子类)
1)子类重写这个方法,在容器刷新的时候可以自定义逻辑
10 registerListeners() 给容器中将所有项目里面的ApplicationListener注册进来了
1)从容器中拿到所有ApplicationListener
2) 将每个监听器添加到时间派发器中
getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName)
3) 派发之前步骤产生的事件
11 finishBeanFactoryInitialization(beanFactory) 初始化所有剩下的单实例bean
1)获取容器中的所有Bean 一次进行初始和创建对象
2)获取Bdan的定义信息; RootBedanDefinition
3)Bean不是抽象的,是单实例的,懒加载的
1) 判断是否是FactoryBean 是否实现FactoryBean接口的bean
2)不是工厂Bean 利用getBean(beanName) 创建对象
0) getBean(beanName) IOC.getBean()
1)doGetBean(name, null, null ,false)
2) 先获取缓存中保存的单实例Bean。 如果能够获取到这个Bean之前被创建过(所有创建过的单实例Bean都会被缓存起来)
3)缓存中获取不到,开始Bean的创建对象流程
4)标记当前bean已经被创建
5) 获取Bean的定义信息
6) 获取当前Bean依赖的其他Bean,如果有按照getBean() 把依赖的Bean先创建出来
7) 启动单实例Bean的创建流程
1) createBean(beanName, mbd , args)
2) Object bean =resolveBeforeINstantiation(beanName, mbdToUse)
简单总结:
1 Spring容器在启动时候,贤惠保存素有注册进来的Bean的定义信息
xml 注解 给容器注册bean定义信息
2 spring容器会在何时时机创建这些bean
用到这个bean 的时候; 利用getBean创建Bean;创建好以后保存在容器中
统一创建剩下所有的bean的时候; finishBeanFactoryInitialization()
3 后置处理器
1 每一个bean创建完成都会使用各种后置处理器进行处理,来增强bean的功能
处理自动注入 aop功能等 以及支持异步调用的 任务调度的 增强功能注解都是有响应的后置处理器
4 时间驱动模型
ApplicationListener 事件监听
ApplicationEventMulticaster 事件派发
Spring容器创建过程的更多相关文章
- Spring源码解析 – AnnotationConfigApplicationContext容器创建过程
Spring在BeanFactory基础上提供了一些列具体容器的实现,其中AnnotationConfigApplicationContext是一个用来管理注解bean的容器,从AnnotationC ...
- SpringMVC——DispatcherServlet的IoC容器(Web应用的IoC容器的子容器)创建过程
在上一篇<Spring--Web应用中的IoC容器创建(WebApplicationContext根应用上下文的创建过程)>中说到了Web应用中的IoC容器创建过程.这一篇主要讲Sprin ...
- SpringIOC容器创建过程
在测试时,经常使用这种方式来创建spring容器 //创建基于注解的springIOC容器 ApplicationContext applicationContext = new Annotation ...
- 51、[源码]-Spring容器创建-容器创建完成
51.[源码]-Spring容器创建-容器创建完成 12.finishRefresh();完成BeanFactory的初始化创建工作:IOC容器就创建完成: 1).initLifecycleProce ...
- 50、[源码]-Spring容器创建-Bean创建完成
50.[源码]-Spring容器创建-Bean创建完成 11.finishBeanFactoryInitialization(beanFactory);初始化所有剩下的单实例bean: beanFac ...
- 49、[源码]-Spring容器创建-创建Bean准备
49.[源码]-Spring容器创建-创建Bean准备
- 48、[源码]-Spring容器创建-初始化事件派发器、监听器等
48.[源码]-Spring容器创建-初始化事件派发器.监听器等 8.initApplicationEventMulticaster();初始化事件派发器: 获取BeanFactory 从BeanFa ...
- 47、[源码]-Spring容器创建-初始化MessageSource
47.[源码]-Spring容器创建-初始化MessageSource 7.initMessageSource();初始化MessageSource组件(做国际化功能:消息绑定,消息解析): 获取Be ...
- 46、[源码]-Spring容器创建-注册BeanPostProcessors
46.[源码]-Spring容器创建-注册BeanPostProcessors 6.registerBeanPostProcessors(beanFactory);注册BeanPostProcesso ...
随机推荐
- 【BZOJ3829】[Poi2014]FarmCraft 树形DP(贪心)
[BZOJ3829][Poi2014]FarmCraft Description In a village called Byteville, there are houses connected ...
- jpa单向一对一关系外键映射
项目结构: Wife package auth.model; import javax.persistence.Column; import javax.persistence.Entity; imp ...
- springmvc的一个错误
初学ssm,碰到一个错误,非注解的就没错,注解的就错了 找了半天,终于发现错误,真的很傻比啊,导入的springframework版本不一致... 都导入4.3.18版本的即可...
- [Algorithms] Radix Sort
Radix sort is another linear time sorting algorithm. It sorts (using another sorting subroutine) the ...
- 全局安装了express框架,但是无法使用express指令的问题
错误截图: 产生这个错误的原因是:我安装的是express4版本,需要安装express-generator才能使用express命令 将express-generator安装后就都解决了:
- Oracle数据库模型(OLAP/OLTP)
数据库模型 选择数据库模型: 联机事务处理OLTP(on-line transaction processing) OLTP是传统的关系数据库的主要应用,基本的.日常的事务处理.例如银行交易. OLT ...
- info 手册
info flex 可以查看flex帮助. h就可以看到相关命令,常用命令已经加粗: x 关闭此帮助窗口. q 一并退出 Info. RET ...
- IIS网站部署解决报错
入坑2次,这次还是得马上总结起来== 部署网站报以上错 检查方法 步骤一:检查部署的网站路径是否正确 步骤二: 检查Internet信息管理器中,应用程序池的.net Framework版本,选择v4 ...
- Java实现八大排序之冒泡排序
冒泡排序 冒泡排序的定义: 冒泡排序(Bubble Sort)它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该 ...
- 请教Hibernate和JPA什么区别?
JPA是Java的持久化规范.Hibernate早期是一个ORM框架,后期是JPA的一个实现.