创立IOC容器 createApplicationContext()
protected ConfigurableApplicationContext createApplicationContext() { return this.applicationContextFactory.create(this.webApplicationType); }=============依据以后的利用类型(Servlet)创立容器//以后会创立AnnotationConfigServletWebServerApplicationContextApplicationContextFactory DEFAULT = (webApplicationType) -> { try { switch (webApplicationType) { case SERVLET: return new AnnotationConfigServletWebServerApplicationContext(); case REACTIVE: return new AnnotationConfigReactiveWebServerApplicationContext(); default: return new AnnotationConfigApplicationContext(); } } catch (Exception ex) { throw new IllegalStateException("Unable create a default ApplicationContext instance, " + "you may need a custom ApplicationContextFactory", ex); } };
筹备ApplicationContext IOC容器的根本信息 prepareContext()
private void prepareContext(DefaultBootstrapContext bootstrapContext, ConfigurableApplicationContext context, ConfigurableEnvironment environment, SpringApplicationRunListeners listeners, ApplicationArguments applicationArguments, Banner printedBanner) { //保留后面的根底环境 context.setEnvironment(environment); //IOC容器的后置解决流程。 postProcessApplicationContext(context); //利用初始化器:applyInitializers applyInitializers(context); //遍历所有的 listener 调用 contextPrepared //ioc容器的环境准备就绪了(contextPrepared办法的源码在上面) listeners.contextPrepared(context); //疏导上下文的环境敞开了 bootstrapContext.close(context); if (this.logStartupInfo) { logStartupInfo(context.getParent() == null); logStartupProfileInfo(context); } // Add boot specific singleton beans //拿到bean工厂 ConfigurableListableBeanFactory beanFactory = context.getBeanFactory(); //注册单实例 beanFactory.registerSingleton("springApplicationArguments", applicationArguments); //打印banner if (printedBanner != null) { beanFactory.registerSingleton("springBootBanner", printedBanner); } if (beanFactory instanceof DefaultListableBeanFactory) { ((DefaultListableBeanFactory) beanFactory) .setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding); } if (this.lazyInitialization) { context.addBeanFactoryPostProcessor(new LazyInitializationBeanFactoryPostProcessor()); } // Load the sources Set<Object> sources = getAllSources(); Assert.notEmpty(sources, "Sources must not be empty"); load(context, sources.toArray(new Object[0])); //listeners:监听器 listeners.contextLoaded(context); }================== postProcessApplicationContext(context);protected void postProcessApplicationContext(ConfigurableApplicationContext context) { if (this.beanNameGenerator != null) {//注册组件 context.getBeanFactory().registerSingleton(AnnotationConfigUtils.CONFIGURATION_BEAN_NAME_GENERATOR, this.beanNameGenerator); } if (this.resourceLoader != null) { //读取配置文件的资源 if (context instanceof GenericApplicationContext) { ((GenericApplicationContext) context).setResourceLoader(this.resourceLoader); } if (context instanceof DefaultResourceLoader) { //资源加载器 ((DefaultResourceLoader) context).setClassLoader(this.resourceLoader.getClassLoader()); } } //筹备类型转换器 if (this.addConversionService) { context.getBeanFactory().setConversionService(ApplicationConversionService.getSharedInstance()); } }===================applyInitializers(context)protected void applyInitializers(ConfigurableApplicationContext context) {//遍历所有的 ApplicationContextInitializer。调用 initialize。来对ioc容器进行初始化扩大性能 for (ApplicationContextInitializer initializer : getInitializers()) { //之前从spring.factories找进去的七个Initializer Class<?> requiredType = GenericTypeResolver.resolveTypeArgument(initializer.getClass(), ApplicationContextInitializer.class); Assert.isInstanceOf(requiredType, context, "Unable to call initializer."); initializer.initialize(context); } }@Override public void initialize(ConfigurableApplicationContext context) { ConfigurableEnvironment environment = context.getEnvironment(); List<Class<?>> initializerClasses = getInitializerClasses(environment); //如果initializerClasses不为空,就把他们实例化。 if (!initializerClasses.isEmpty()) { applyInitializerClasses(context, initializerClasses); } }===========contextPrepared()void contextPrepared(ConfigurableApplicationContext context) { doWithListeners("spring.boot.application.context-prepared", (listener) -> listener.contextPrepared(context));}private void doWithListeners(String stepName, Consumer<SpringApplicationRunListener> listenerAction) { doWithListeners(stepName, listenerAction, null);}private void doWithListeners(String stepName, Consumer<SpringApplicationRunListener> listenerAction, Consumer<StartupStep> stepAction) { StartupStep step = this.applicationStartup.start(stepName); //拿到所有的listeners //实际上是EventPublishRunListenr:告诉所有的监听器contextPrepared容器的上下文环境曾经筹备好了 this.listeners.forEach(listenerAction); if (stepAction != null) { stepAction.accept(step); } step.end();}================contextLoaded()void contextLoaded(ConfigurableApplicationContext context) { doWithListeners("spring.boot.application.context-loaded", (listener) -> listener.contextLoaded(context));}private void doWithListeners(String stepName, Consumer<SpringApplicationRunListener> listenerAction) { doWithListeners(stepName, listenerAction, null);}private void doWithListeners(String stepName, Consumer<SpringApplicationRunListener> listenerAction, Consumer<StartupStep> stepAction) { StartupStep step = this.applicationStartup.start(stepName); //所有的监听器去调用contextLoaded(context) //告诉所有的监听器contextLoaded;容器的上下文环境曾经加载好了 this.listeners.forEach(listenerAction); if (stepAction != null) { stepAction.accept(step); } step.end();}(listener) -> listener.contextLoaded(context)