springboo 1.5.5 启动类分析


    /**
     * Run the Spring application, creating and refreshing a new
     * {@link ApplicationContext}.
     * @param args the application arguments (usually passed from a Java main method)
     * @return a running {@link ApplicationContext}
     */
    public ConfigurableApplicationContext run(String... args) {
        //run之前,调用initialize()方法 获取context初始化类,并初始化
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        ConfigurableApplicationContext context = null;
        FailureAnalyzers analyzers = null;
        configureHeadlessProperty(); //处理无显示器
        //将spring.factories中的类(实现了SpringApplicationRunListener的)初始化放入list上
        //默认加载了EventPublishingRunListener等类
        SpringApplicationRunListeners listeners = getRunListeners(args);
        //运行这些注册了的Event的start方法
        listeners.starting();
        try {
            ApplicationArguments applicationArguments = new DefaultApplicationArguments(
                    args);
            //读取环境配置,并再读取完后调用listeners的environmentPrepared方法
            //1.获取系统环境参数->将arg中的参数赋值给enviroment->更新activeprofile->调用listener方法
            ConfigurableEnvironment environment = prepareEnvironment(listeners,
                    applicationArguments);
            //读取启动控制台Banner
            Banner printedBanner = printBanner(environment);
            //检查是否存在ConfigurableWebApplicationContext,来选择初始化相应的Context(存在则为web项目)
            //AnnotationConfigEmbeddedWebApplicationContext
            context = createApplicationContext();
            //初始化spring.factories中实现了FailureAnalyzer接口的类
            //用来分析异常并且提供诊断信息,在SpringApplication中的run方法的执行过程中出错时调用
            analyzers = new FailureAnalyzers(context);
            //准备context,初始化之后调用listeners.contextPrepared,将bean加载到context中,加载完成后调用listeners.contextLoaded
            //contexr为AnnotationConfigApplicationContext
            //1.调用contextInitializers的initialize方法
            //2.调用listeners的contextPrepared方法
            //3.将启动类传入加载器,以获得scanner扫描的起始路径
            //4.加载启动类所传的参数sources
            //5.调用listeners的contextLoaded方法
            //class文件解析信息存入AnnotatedGenericBeanDefinition中
            prepareContext(context, environment, listeners, applicationArguments,
                    printedBanner);
            /*
            1.prepareRefresh:
            设置Spring容器的启动时间,撤销关闭状态,开启活跃状态。
            初始化属性源信息(Property)
            验证环境信息里一些必须存在的属性
            2.prepareBeanFactory
            设置classloader(用于加载bean),设置表达式解析器(解析bean定义中的一些表达式),添加属性编辑注册器(注册属性编辑器)
            添加ApplicationContextAwareProcessor这个BeanPostProcessor。取消ResourceLoaderAware、ApplicationEventPublisherAware、MessageSourceAware、ApplicationContextAware、EnvironmentAware这5个接口的自动注入。因为ApplicationContextAwareProcessor把这5个接口的实现工作做了
            设置特殊的类型对应的bean。BeanFactory对应刚刚获取的BeanFactory;ResourceLoader、ApplicationEventPublisher、ApplicationContext这3个接口对应的bean都设置为当前的Spring容器
            注入一些其它信息的bean,比如environment、systemProperties等
            3.postProcessBeanFactory 进行后续的一些BeanFactory操作
            4.invokeBeanFactoryPostProcessors 在Spring容器中找出实现了BeanFactoryPostProcessor接口的processor并执行。(这里处理了很多注解,比如@SpringBootApplication)
            5.registerBeanPostProcessors 从Spring容器中找出的BeanPostProcessor接口的bean,并设置到BeanFactory的属性中。
            6.initMessageSource 国际化
            7.initApplicationEventMulticaster 在Spring容器中初始化事件广播器,拿出BeanFactory中的事件广播器然后设置到Spring容器的属性中
            8.onRefresh 调用createEmbeddedServletContainer方法去创建内置的Servlet容器。
            9.registerListeners 把Spring容器内的时间监听器和BeanFactory中的时间监听器都添加的事件广播器中
            10.finishBeanFactoryInitialization 实例化BeanFactory中已经被注册但是未实例化的所有实例
            11.finishRefresh
            初始化生命周期处理器,并设置到Spring容器中(LifecycleProcessor)
            调用生命周期处理器的onRefresh方法,这个方法会找出Spring容器中实现了SmartLifecycle接口的类并进行start方法的调用
            发布ContextRefreshedEvent事件告知对应的ApplicationListener进行响应的操作
            调用LiveBeansView的registerApplicationContext方法:如果设置了JMX相关的属性,则就调用该方法
            发布EmbeddedServletContainerInitializedEvent事件告知对应的ApplicationListener进行响应的操作
             */
            refreshContext(context);
            // 执行*Runner类
            afterRefresh(context, applicationArguments);
            //调用listeners的finished方法
            listeners.finished(context, null);
            stopWatch.stop();
            if (this.logStartupInfo) {
                new StartupInfoLogger(this.mainApplicationClass)
                        .logStarted(getApplicationLog(), stopWatch);
            }
            return context;
        }
        catch (Throwable ex) {
            handleRunFailure(context, listeners, analyzers, ex);
            throw new IllegalStateException(ex);
        }
    }

你可能感兴趣的:(自学spring,spring,boot)