如何在 springboot 项目中调用 main 函数?

您所在的位置:网站首页 如何在函数中加入函数 如何在 springboot 项目中调用 main 函数?

如何在 springboot 项目中调用 main 函数?

#如何在 springboot 项目中调用 main 函数?| 来源: 网络整理| 查看: 265

前言

SpringBoot项目启动时通过执行main方法启动,main方法主要做了两方面工作:

初始化Spring容器

启动tomcat运行项目

下面我们通过源码来看如何进行的上面两个操作。

源码分析

我们以debug的方式进行源码的分析。main方法中,我们调用了SpringApplication的run方法启动项目,我们看run方法的源码:

public ConfigurableApplicationContext run(String... args) { StopWatch stopWatch = new StopWatch(); stopWatch.start(); ConfigurableApplicationContext context = null; Collection exceptionReporters = new ArrayList(); configureHeadlessProperty(); SpringApplicationRunListeners listeners = getRunListeners(args); listeners.starting(); try { ApplicationArguments applicationArguments = new DefaultApplicationArguments(args); ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments); configureIgnoreBeanInfo(environment); Banner printedBanner = printBanner(environment); context = createApplicationContext(); exceptionReporters = getSpringFactoriesInstances(SpringBootExceptionReporter.class, new Class[] { ConfigurableApplicationContext.class }, context); prepareContext(context, environment, listeners, applicationArguments, printedBanner); refreshContext(context); afterRefresh(context, applicationArguments); stopWatch.stop(); if (this.logStartupInfo) { new StartupInfoLogger(this.mainApplicationClass).logStarted(getApplicationLog(), stopWatch); } listeners.started(context); callRunners(context, applicationArguments); } catch (Throwable ex) { handleRunFailure(context, ex, exceptionReporters, listeners); throw new IllegalStateException(ex); } try { listeners.running(context); } catch (Throwable ex) { handleRunFailure(context, ex, exceptionReporters, null); throw new IllegalStateException(ex); } return context; }

在如下代码中,创建了上下文对象:

context = createApplicationContext();

可以看到,在SpringBoot中,使用的AnnotationConfigServletWebServerApplicationContext类作为上下文对象,它也是ApplicationContext的一个子类。

所以,当调用如下代码时:

refreshContext(context);

最终,走入了ApplicationContext的refresh方法中,进行了Spring容器的启动。

在Spring的refresh方法中,应用了模板设计模式,其内部的onRefresh方法就是个钩子方法,让子类进行实现。我们上面提到,SpringBoot用了AnnotationConfigServletWebServerApplicationContext作为上下文对象,所以最终调用的是这个类的onRefresh方法。我们看这个方法源码:

protected void onRefresh() { super.onRefresh(); try { createWebServer(); } catch (Throwable ex) { throw new ApplicationContextException("Unable to start web server", ex); } }

在createWebServer方法中往下追代码,最终追到getWebServer方法,看其源码:

public WebServer getWebServer(ServletContextInitializer... initializers) { if (this.disableMBeanRegistry) { Registry.disableRegistry(); } Tomcat tomcat = new Tomcat(); File baseDir = (this.baseDirectory != null) ? this.baseDirectory : createTempDir("tomcat"); tomcat.setBaseDir(baseDir.getAbsolutePath()); Connector connector = new Connector(this.protocol); connector.setThrowOnFailure(true); tomcat.getService().addConnector(connector); customizeConnector(connector); tomcat.setConnector(connector); tomcat.getHost().setAutoDeploy(false); configureEngine(tomcat.getEngine()); for (Connector additionalConnector : this.additionalTomcatConnectors) { tomcat.getService().addConnector(additionalConnector); } prepareContext(tomcat.getHost(), initializers); return getTomcatWebServer(tomcat); }

可以看到,这里采用编程式的tomcat,进行了启动。 我们也可以自己new出一个Tomcat来,进行tomcat的运行。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3