spring源码---1 web容器启动

1 ContextLoaderListener extends ContextLoader implements ServletContextListener 中的init方法中 创建WebApplicationContext。
2 加载对应的spring配置文件中的Bean。
3 将WebApplicationContext放入ServletContext(Java Web的全局变量)中。
4 AbstractApplicationContext的refresh方法

1 refresh方法

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

            //2 获取BeanFactory;默认实现是DefaultListableBeanFactory,在创建容器的时候创建的
            ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

            //3 BeanFactory的预准备工作(BeanFactory进行一些设置,比如context的类加载器,BeanPostProcessor和XXXAware自动装配等)
            prepareBeanFactory(beanFactory);

            try {
                //4 BeanFactory准备工作完成后进行的后置处理工作
                postProcessBeanFactory(beanFactory);

                //5 执行BeanFactoryPostProcessor的方法;
                invokeBeanFactoryPostProcessors(beanFactory);

                //6 注册BeanPostProcessor(Bean的后置处理器),在创建bean的前后等执行
                registerBeanPostProcessors(beanFactory);

                //7 初始化MessageSource组件(做国际化功能;消息绑定,消息解析);
                initMessageSource();

                //8 初始化事件派发器
                initApplicationEventMulticaster();

                //11 子类重写这个方法,在容器刷新的时候可以自定义逻辑;如创建Tomcat,Jetty等WEB服务器
                onRefresh();

                //11 注册应用的监听器。就是注册实现了ApplicationListener接口的监听器bean,这些监听器是注册到ApplicationEventMulticaster中的
                registerListeners();

                //12 初始化所有剩下的非懒加载的单例bean
                finishBeanFactoryInitialization(beanFactory);

                // 13 完成context的刷新。主要是调用LifecycleProcessor的onRefresh()方法,并且发布事件(ContextRefreshedEvent)
                finishRefresh();
            }
    }

1 prepareRefresh方法

表示在真正做refresh操作之前需要准备做的事情:

1 设置Spring容器的启动时间,
2 开启活跃状态,撤销关闭状态,。
3 初始化context environment(上下文环境)中的占位符属性来源。
4 验证环境信息里一些必须存在的属性

2 obtainFreshBeanFactory

让这个类(AbstractApplicationContext)的子类刷新内部bean工厂。

AbstractRefreshableApplicationContext容器:实际上就是重新创建一个bean工厂,并设置工厂的一些属性。
GenericApplicationContext容器:获取创建容器的就创建的bean工厂,并且设置工厂的ID.

3 prepareBeanFactory方法

已经把工厂建好了,但是还不能投入使用,因为工厂里什么都没有, 配置这个工厂的标准环境,比如context的类加载器和post-processors后处理器。
1 类加载器
2 bean工厂级别的 post-processors后处理器。

4 定制不同ApplicationContext的 bean工厂级别的post processors

bean工厂进行了许多配置,现在需要对bean工厂进行一些处理。不同的Spring容器做不同的操作。比如GenericWebApplicationContext容器的操作会在BeanFactory中添加ServletContextAwareProcessor用于处理ServletContextAware类型的bean初始化的时候调用setServletContext或者setServletConfig方法(跟ApplicationContextAwareProcessor原理一样)

5 invokeBeanFactoryPostProcessors方法

主动调用

6 registerBeanPostProcessors 注册bean 级别的post process

7 initMessageSource 初始化国际化

8 initApplicationEventMulticaster方法

在Spring容器中初始化事件广播器,事件广播器用于事件的发布。

9 onRefresh方法

一个模板方法,不同的Spring容器做不同的事情。

比如web程序的容器ServletWebServerApplicationContext中会调用createWebServer方法去创建内置的Servlet容器。

目前SpringBoot只支持3种内置的Servlet容器:

Tomcat
Jetty
Undertow

10 registerListeners方法

注册应用的监听器。就是注册实现了ApplicationListener接口的监听器bean,这些监听器是注册到ApplicationEventMulticaster中的。这不会影响到其它监听器bean。在注册完以后,还会将其前期的事件发布给相匹配的监听器

11 finishBeanFactoryInitialization 实例化非惰性bean

实例化BeanFactory中已经被注册但是未实例化的所有实例(懒加载的不需要实例化)。

比如invokeBeanFactoryPostProcessors方法中根据各种注解解析出来的类,在这个时候都会被初始化。

实例化的过程各种BeanPostProcessor开始起作用。

后面在详细分析此步骤

12 finishRefresh方法

refresh做完之后需要做的其他事情。

1 初始化生命周期处理器,并设置到Spring容器中(LifecycleProcessor)
2 调用生命周期处理器的onRefresh方法,这个方法会找出Spring容器中实现了SmartLifecycle接口的类并进行start方法的调用
3 发布ContextRefreshedEvent事件告知对应的ApplicationListener进行响应的操作
4 如果是web容器ServletWebServerApplicationContext还会启动web服务和发布消息

参考

1 https://www.cnblogs.com/grasp/p/11942735.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值