spring启动

1、web根容器初始化:web容器监听器初始化,通过ContextLoaderListener 初始化,该类继承ServletContextListener ,该类contextInitialized方法,initWebApplicationContext初始化spring公共容器环境:WebApplicationContext的实例化对象为XmlWebApplicationContext类。获取web.xml中配置的contextConfigLocation路径,获取应用的访问路径,获取spring相关的XML配置文件的路径,并且刷新当前的WebApplicationContext配置相关。最后将该上下文对象放入servlet上下文参数中。

 

2、bean初始化:

   org.springframework.context.support.AbstractApplicationContext.refresh() ,这个方法完成了spring IOC容器的初始化,web项目默认用实现类XmlWebApplicationContext,它作为web上下文,而他的父类AbstractRefreshableApplicationContext类有个DefaultListableBeanFactory的属性,这才是真正的容器,所有的bean的初始化都是通过此类,他们都实现了BeanFactory接口。 下一步调用obtainFreshBeanFactory(),初始化bean工厂, 使用的是DefaultListableBeanFactory类,该类实现两大接口ConfigurableListableBeanFactory(BeanFactory子类)和BeanDefinitionRegistry接口,就有了bean容器和bean注册功能。进入loadBeanDefinitions方法, 这里把(web.xml)配置的xml路径交给BeanDefinitionReader解析并加载成BeanDefinition, 最终进入下面XmlBeanDefinitionReader的loadBeanDefinitions方法, 这个方法,

回到refresh()方法,看下一步prepareBeanFactory(beanFactory)

再回到refresh方法,

// 初始化messageSource, 如果不存在messageSource的bean定义,就使用
initMessageSource();

// 初始化事件广播, 如果不包含applicationEventMulticaster bean定义就使用默认的SimpleApplicationEventMulticaster
initApplicationEventMulticaster();

//用于注册监听到事件广播 ,必须实现org.springframework.context.ApplicationListener接口, 

registerListeners() 

//初始化主题资源,没有就采用默认

onRefresh()

 

 

1.ClassPathXmlApplicationContext为入口构造方法中有个refresh()方法用来初始化Spring 
refresh运行的大致流程: 
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();—-2 
invokeBeanFactoryPostProcessors(beanFactory);——————————3 
registerBeanPostProcessors(beanFactory);———————————–4 
initMessageSource();——————————————————-5 
initApplicationEventMulticaster();—————————————–6 
onRefresh();—————————————————————7 
registerListeners();——————————————————-8 
beanFactory.preInstantiateSingletons();————————————9 
publishEvent(new ContextRefreshedEvent(this));—————————–10

2.解析XML并且初始化工厂类,BeanFactory工厂提供了获得bean实例的能力,通过AbstractApplicationContext类中的obtainFreshBeanFactory方法调用refreshBeanFactory实例化一个默认的BeanFactory工厂DefaultListableBeanFactory,然后调用loadBeanDefinitions装载配置文件,解析配置文件(XmlBeanDefinitionReader)时会创建BeanDefinition并且放到容器DefaultListableBeanFactory中去

3.执行工厂后置处理器,这时会查找所有BeanFactory(DefaultListableBeanFactory)工厂中的bean找出所有BeanFactoryPostProcessor实现类bean,并且调用方法postProcessBeanDefinitionRegistry,这个方法可以在bean实例化之前修改配置信息(比如变量值) 
PS:用户自定义BeanFactoryPostProcessor

4.注册后置处理器,这时会查找所有BeanFactory(DefaultListableBeanFactory)工厂中的bean找出所有BeanPostProcessor实现类bean,并且把他们注册到BeanFactory容器中去,和第3种工厂后置处理器的区别是BeanFactoryPostProcessor会立即调用,而BeanPostProcessor注册到BeanFactory中 
PS:用户自定义BeanPostProcessor

5.默认注册一个bean名称为messageSource的bean用于国际化处理,这里Spring自带很多种实现,这个方法会先查找BeanFactory中的bean是否有messageSource名称的bean如果没有给一个默认的实现DelegatingMessageSource 
PS:用户可以自定义名称为messageSource的bean,只需要实现MessageSource即可

6.Spring事件体系包括三个组件:事件,事件监听器,事件广播器。这里是初始化事件广播器,如果用户有自定义applicationEventMulticaster名称的bean并且实现ApplicationEventMulticaster则不需要处理,如果没有就给一个默认的实现SimpleApplicationEventMulticaster 
PS:用户可以自定义名称applicationEventMulticaster并且实现ApplicationEventMulticaster接口的bean

7.初始化一些特殊的bean,一般很少用

8.Spring事件体系包括三个组件:事件,事件监听器,事件广播器。这里是事件监听器,上下文会在BeanFactory找到所有实现ApplicationListener的bean然后添加到事件广播器ApplicationEventMulticaster中去

9.初始化单例的bean,实例化BeanFactory中所有的bean,(Spring配置的是单例设置scope=”prototype”可以配置多例模式)

10.发布上下文刷新事件,事件广播器负责将些事件广播到每个注册的事件监听器中,容器启动完成
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值