返回顶部
首页 > 资讯 > 精选 >SpringBoot应用的启动入口怎么封装
  • 768
分享到

SpringBoot应用的启动入口怎么封装

2023-06-30 15:06:23 768人浏览 泡泡鱼
摘要

这篇文章主要介绍了SpringBoot应用的启动入口怎么封装的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇springBoot应用的启动入口怎么封装文章都会有所收获,下面我们一起来看看吧。Springboot可

这篇文章主要介绍了SpringBoot应用的启动入口怎么封装的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇springBoot应用的启动入口怎么封装文章都会有所收获,下面我们一起来看看吧。

SpringBoot应用的启动入口怎么封装

Springboot可以说是Java程序员必备技能了,大家都知道Springboot最终可以通过Maven打成jar包,然后直接使用java -jar命令运行一个WEB工程(或其它)。这样就避免了原先基于Tomcat的web工程的复杂操作。Springboot能够使Web服务的部署简单到如此程度是因为其内置了Jetty(或Tomcat)服务器,并且在容器启动过程中start该服务器,成功运行Web服务。

相信各位Springbooter一定不会陌生下面的代码,无论是初学Springboot的新同学,或是开始研究Springboot源码的新司机,这段代码几乎是我们的落脚点。我们如此熟悉它,以至于认为它就是Springboot这个魔法乐园的起点。但真的是这样吗?

 @SpringBootApplication public class Springboot01helloworldApplication {     public static void main(String[] args) {         SpringApplication.run(Springboot01helloworldApplication.class, args);     } }

我们都知道,一个Java工程打包过后,这个jar包的入口描述被写在了/META-INF/MANIFEST.MF文件下,下面让我们来看看这个文件内容:

 Manifest-Version: 1.0 ArcHiver-Version: Plexus Archiver Built-By: MrXu Start-Class: com.vivo.internet.nex.repeater.console.RepeaterConsoleApplication Spring-Boot-Classes: BOOT-INF/classes/ Spring-Boot-Lib: BOOT-INF/lib/ Spring-Boot-Version: 1.5.19.RELEASE Created-By: Apache Maven 3.8.1 Build-jdk: 1.8.0_281 Main-Class: org.springframework.boot.loader.JarLauncher

文件入口的描述为Main-Class对应的value,即org.springframework.boot.loader.JarLauncher。那么,接下来我们需要看下这个类究竟做了什么?

 // JarLauncher.java public class JarLauncher extends ExecutableArchiveLauncher {     static final String BOOT_INF_CLASSES = "BOOT-INF/classes/";     static final String BOOT_INF_LIB = "BOOT-INF/lib/";     public JarLauncher() {     }     // ...省略无关代码     public static void main(String[] args) throws Exception {         (new JarLauncher()).launch(args);     } }

明显的main函数吸引了我们的注意,没错了,这就是入口,看看JarLauncher的空构造并没有任何代码,我们先往它的父类找找:

 // ExecutableArchiveLauncher.java public abstract class ExecutableArchiveLauncher extends Launcher {     public ExecutableArchiveLauncher() {         try {             this.archive = this.createArchive();         } catch (Exception var2) {             throw new IllegalStateException(var2);         }     }     // ...省略 }  // Launcher.java public abstract class Launcher {     public Launcher() {}     // ...省略无关代码 }

从代码中可以看出,真正干了事情的父类是ExecutableArchiveLauncher,它在初始化时构造了archive实例,该实例封装了/META-INF/MANIFEST.MF文件的信息。后面我们也会用到它。

随后便是launch方法,我们只关系核心执行流程:

 // Launcher.java protected void launch(String[] args) throws Exception {     JarFile.reGISterUrlProtocolHandler();     ClassLoader classLoader = this.createClassLoader(this.getClassPathArchives());     this.launch(args, this.getMainClass(), classLoader); } // ExecutableArchiveLauncher.java protected String getMainClass() throws Exception {     Manifest manifest = this.archive.getManifest();     String mainClass = null;     if (manifest != null) {         mainClass = manifest.getMainAttributes().getValue("Start-Class");     }      if (mainClass == null) {         throw new IllegalStateException("No 'Start-Class' manifest entry specified in " + this);     } else {         return mainClass;     } }

这里首先调用子类ExecutableArchiveLauncher的getMainClass方法,主要逻辑就是从/META-INF/MANIFEST.MF文件中获取Start-Class信息,对应上文就是com.vivo.internet.nex.repeater.console.RepeaterConsoleApplication字符串,这样就和我们写的启动类关联上了。

然后是launch方法的具体执行,launch()首先创建一个MainMethodRunner,将上文获取的Start-Class和透传的参数传递进去,然后调用MainMethodRunner的run方法。run方法的执行也非常简单,就是加载Start-Class对应的启动类,然后反射调用启动类的main方法。之后就是容器的初始化过程了。

 // Launcher.java protected void launch(String[] args, String mainClass, ClassLoader classLoader) throws Exception {     Thread.currentThread().setContextClassLoader(classLoader);     // 这里首先调用createMainMethodRunner创建一个MainMethodRunner实例,将mainClass和args参数传入。随后调用     this.createMainMethodRunner(mainClass, args, classLoader).run(); } protected MainMethodRunner createMainMethodRunner(String mainClass, String[] args, ClassLoader classLoader) {     return new MainMethodRunner(mainClass, args); }  // MainMethodRunner.java public MainMethodRunner(String mainClass, String[] args) {     this.mainClassName = mainClass;     this.args = args != null ? (String[])args.clone() : null; } public void run() throws Exception {     Class<?> mainClass = Thread.currentThread().getContextClassLoader().loadClass(this.mainClassName);     Method mainMethod = mainClass.getDeclaredMethod("main", String[].class);     mainMethod.invoke((Object)null, this.args); }

关于“SpringBoot应用的启动入口怎么封装”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“SpringBoot应用的启动入口怎么封装”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: SpringBoot应用的启动入口怎么封装

本文链接: https://lsjlt.com/news/329949.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • SpringBoot应用的启动入口怎么封装
    这篇文章主要介绍了SpringBoot应用的启动入口怎么封装的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SpringBoot应用的启动入口怎么封装文章都会有所收获,下面我们一起来看看吧。Springboot可...
    99+
    2023-06-30
  • 快速掌握SpringBoot应用的启动入口
    目录1、一切的开始2、总结 Springboot可以说是Java程序员必备技能了,大家都知道Springboot最终可以通过maven打成jar包,然后直接使用java -jar命令...
    99+
    2024-04-02
  • SpringBoot怎么封装统一响应体
    这篇文章主要介绍了SpringBoot怎么封装统一响应体,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、前言关于统一响应体的封装,没有一个标准答案,我在各种技术社区看了一遍...
    99+
    2023-06-15
  • 怎么自定义springboot的启动端口
    本篇文章为大家展示了怎么自定义springboot的启动端口,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。可以通过实现EmbeddedServletContainerCustomizer接口来实现:...
    99+
    2023-05-31
    springboot bo
  • springboot封装接口的方法是什么
    在Spring Boot中封装接口的方法有很多种,下面列举其中一种常用的方法:1. 创建一个接口类,定义接口的请求路径、请求方法和请...
    99+
    2023-10-21
    springboot
  • springboot中怎么设置启动端口
    这篇文章给大家介绍springboot中怎么设置启动端口,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。可以通过实现EmbeddedServletContainerCustomizer接口来实现:public ...
    99+
    2023-06-03
  • SpringBoot应用是如何启动的
    这篇文章将为大家详细讲解有关SpringBoot应用是如何启动的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 SpringBoot项目通过SpringApplication.ru...
    99+
    2023-05-31
    springboot
  • springboot启动怎么排除某些bean的注入
    本篇内容主要讲解“springboot启动怎么排除某些bean的注入”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“springboot启动怎么排除某些bean的注入”吧!springboot 启...
    99+
    2023-06-20
  • springboot应用服务启动事件的监听怎么实现
    本篇内容主要讲解“springboot应用服务启动事件的监听怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“springboot应用服务启动事件的监听怎么实现”吧!一、简介Spring B...
    99+
    2023-06-29
  • SpringBoot的jar包怎么启动
    这篇文章主要介绍了SpringBoot的jar包怎么启动,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、简介使用过SprongBoot打过jar包的都应该知道,目标文件一般...
    99+
    2023-06-29
  • windows封装系统怎么加入驱动总裁
    本文小编为大家详细介绍“windows封装系统怎么加入驱动总裁”,内容详细,步骤清晰,细节处理妥当,希望这篇“windows封装系统怎么加入驱动总裁”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。封装系统加入驱动总...
    99+
    2023-07-01
  • springboot启动时怎么获取端口和项目名
    小编给大家分享一下springboot启动时怎么获取端口和项目名,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!springboot启动获取端口和项目名背景项目启动...
    99+
    2023-06-25
  • 怎么制作Windows7封装自动应答文件
    最近在研究Windows 7的封装,虽然网上有一些工具可以实现无人参与封装,但是现在还没有使用过,自己安装了Windows AIK,也在反复的学习,刚开始的时候不知道冲什么地方下手,我有个习惯,不知道的东西,喜欢先上网找...
    99+
    2023-06-03
    Windows7封装 Windows 文件
  • Springboot通过run启动web应用的方法
    目录一、SpringBootApplication背后的秘密1、@Configuration2、@ComponentScan3、@EnableAutoConfiguration二、深...
    99+
    2024-04-02
  • 怎么使用bat启动springboot项目
    这篇“怎么使用bat启动springboot项目”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么使用bat启动spring...
    99+
    2023-06-08
  • 使用run()方法怎么启动SpringBoot
    本篇文章给大家分享的是有关使用run()方法怎么启动SpringBoot,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。入口通常一个简单的SpringBoot基础项目我们会有如下...
    99+
    2023-06-14
  • Springboot自动装配之注入DispatcherServlet怎么实现
    这篇文章主要介绍“Springboot自动装配之注入DispatcherServlet怎么实现”,在日常操作中,相信很多人在Springboot自动装配之注入DispatcherServlet怎么实现问题上存在疑惑,小编查阅了各式资料,整理...
    99+
    2023-06-30
  • Vue怎么创建应用入口
    这篇文章主要介绍“Vue怎么创建应用入口”,在日常操作中,相信很多人在Vue怎么创建应用入口问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue怎么创建应用入口”的疑惑有所帮助!接下来,请跟着小编一起来学习吧...
    99+
    2023-06-26
  • springboot应用服务启动事件的监听实现
    目录一、简介二、常用场景介绍二、代码小实验 通过@Component定义方式实现通过@Bean定义方式实现三、执行测试四、总结五、问题总结一、简介 Spring Boot提供了两个接...
    99+
    2024-04-02
  • Flex应用程序怎么启动
    这篇文章主要介绍了Flex应用程序怎么启动,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Flex应用程序启动编写一个简单的Flex应用程序并不复杂,就算你从来没接触过Flex...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作