当前位置:首页 > 数码 > 起步依赖及其成功原理-Springboot (起步依赖及其原因分析)

起步依赖及其成功原理-Springboot (起步依赖及其原因分析)

admin4个月前 (05-14)数码17

了解Springboot起步依赖及其成功原理

"起步依赖"通常是指在软件开发中经常使用的一种构建工具,它可以智能下载、性能和治理名目中所需的依赖项。在开发中,最经常出现的构建工具是Maven和Gradle,它们都支持起步依赖。起步依赖通罕用于创立和治理Java运行程序的依赖项,例如库、框架、插件等。

以下是无关起步依赖的一些信息和示例代码:

1.SpringBoot起步依赖

SpringBoot是一个用于构建Java运行程序的框架,它提供了许多现成的起步依赖,可以轻松地集成不同的性能和服务。例如,假构想创立一个SpringBoot运行程序,并经常使用SpringWeb来构建RESTfulAPI,可以在Maven或Gradle名目中参与以下起步依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
Springboot
implementation'org.springframework.boot:spring-boot-starter-web'

这个起步依赖将智能引入一切必要的依赖项,包括Spring框架和SpringBoot库,以便可以极速开局编写RESTfulAPI。

2.SpringBoot起步依赖的成功原理

SpringBoot起步依赖的成功原理基本上是经过Maven或Gradle来治理依赖。这些起步依赖实质上是一个蕴含了一组依赖项的元数据形容文件,这些依赖项可以智能参与到名目标构建文件中。当将起步依赖参与到名目中时,构建工具会智能解析元数据,并下载和性能所需的依赖项。

SpringBoot起步依赖的元数据通常存储在Maven中央仓库或Gradle仓库中。当恳求参与一个起步依赖时,构建工具会依据元数据文件中的信息来解析和处置依赖。

3.示例代码

这是一个繁难的SpringBoot运行程序示例,经常使用SpringWeb起步依赖来创立一个RESTfulAPI:

importorg.springframework.boot.Springlication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RestController;@SpringBootApplicationpublicclassMyApplication{publicstaticvoidmn(String[]args){SpringApplication.run(MyApplication.class,args);}}@RestControllerclassMyController{@GetMapping("/hello")publicStringsayHello(){return"Hello,World!";}}

这个示例经常使用SpringBoot起步依赖中的SpringWeb模块,用于创立一个繁难的RESTfulAPI,监听门路并前往"Hello,World!"。

宿愿这个示例有助于了解起步依赖的概念以及如何在SpringBoot运行程序中经常使用它们。

示例中完整代码,可以从上方网址失掉:


SpringBoot应用启动原理(二) 扩展URLClassLoader实现嵌套jar加载

在上篇文章《SpringBoot应用启动原理(一) 将启动脚本嵌入jar》中介绍了SpringBoot如何将启动脚本与Runnable Jar整合为Executable Jar的原理,使得生成的jar/war文件可以直接启动 本篇将介绍SpringBoot如何扩展URLClassLoader实现嵌套jar的类(资源)加载,以启动我们的应用。

首先,从一个简单的示例开始

执行 gradle build 构建jar包,里面包含 应用程序 、 第三方依赖 以及SpringBoot 启动程序 ,其目录结构如下

查看的内容(文件的作用请自行GOOGLE)

可以看到,jar的启动类为 ,而并不是我们的 ,应用程序入口类被标记为了Start-Class

jar启动并不是通过应用程序入口类,而是通过JarLauncher代理启动。其实SpringBoot拥有3中不同的Launcher: JarLauncher、 WarLauncher、 PropertiesLauncher

SpringBoot使用Launcher代理启动,其最重要的一点便是可以自定义ClassLoader,以实现对jar文件内(jar in jar)或其他路径下jar、class或资源文件的加载 关于ClassLoader的更多介绍可参考 《深入理解JVM之ClassLoader》

SpringBoot抽象了Archive的概念,一个Archive可以是jar(JarFileArchive),可以是一个文件目录(ExplodedArchive),可以抽象为统一访问资源的逻辑层。

上例中,既为一个JarFileArchive,!/BOOT-INF/lib下的每一个jar包也是一个JarFileArchive 将解压到目录spring-boot-theory-1.0.0,则目录spring-boot-theory-1.0.0为一个ExplodedArchive

按照定义,JarLauncher可以加载内部 /BOOT-INF/lib 下的jar及 /BOOT-INF/classes 下的应用class

其实JarLauncher实现很简单

其主入口新建了JarLauncher并调用父类Launcher中的launch方法启动程序 再创建JarLauncher时,父类ExecutableArchiveLauncher找到自己所在的jar,并创建archive

在Launcher的launch方法中,通过以上archive的getNestedArchives方法找到/BOOT-INF/lib下所有jar及/BOOT-INF/classes目录所对应的archive,通过这些archives的url生成LaunchedURLClassLoader,并将其设置为线程上下文类加载器,启动应用

至此,才执行我们应用程序主入口类的main方法,所有应用程序类文件均可通过/BOOT-INF/classes加载,所有依赖的第三方jar均可通过/BOOT-INF/lib加载

在分析LaunchedURLClassLoader前,首先了解一下URLStreamHandler

java中定义了URL的概念,并实现多种URL协议(见 URL ) * http** file** ftp** jar*等,结合对应的URLConnection可以灵活地获取各种协议下的资源

对于jar,每个jar都会对应一个url,如jar:file:/data/spring-boot-theory/BOOT-INF/lib/!/

jar中的资源,也会对应一个url,并以!/分割,如jar:file:/data/spring-boot-theory/BOOT-INF/lib/!/org/springframework/aop/

对于原始的JarFile URL,只支持一个!/,SpringBoot扩展了此协议,使其支持多个!/,以实现jar in jar的资源,如jar:file:/data/!/BOOT-INF/lib/!/org/springframework/aop/

自定义URL的类格式为[pkgs].[protocol],在运行Launcher的launch方法时调用了 () 以注册自定义的Handler

在处理如下URL时,会循环处理!/分隔符,从最上层出发,先构造的JarFile,再构造的JarFile,最后构造指向的JarURLConnection,通过JarURLConnection的getInputStream方法获取内容

从一个URL,到读取其中的内容,整个过程为

URLClassLoader可以通过原始的jar协议,加载jar中从class文件LaunchedURLClassLoader通过扩展的jar协议,以实现jar in jar这种情况下的class文件加载

构建war包很简单

构建出的war包,其目录机构为

内容为

此时,启动类变为了 ,查看WarLauncher实现,其实与JarLauncher并无太大差别

差别仅在于,JarLauncher在构建LauncherURLClassLoader时,会搜索BOOT-INF/classes目录及BOOT-INF/lib目录下jar,WarLauncher在构建LauncherURLClassLoader时,则会搜索WEB-INFO/classes目录及WEB-INFO/lib和WEB-INFO/lib-provided两个目录下的jar

如此依赖,构建出的war便支持两种启动方式

PropretiesLauncher 的实现与 JarLauncher WarLauncher 的实现极为相似,通过PropretiesLauncher可以实现更为轻量的thin jar,其实现方式可自行查阅源码

spring boot原理

前端常使用模板引擎,主要有FreeMarker和Thymeleaf,它们都是用Java语言编写的,渲染模板并输出相应文本,使得界面的设计与应用的逻辑分离,同时前端开发还会使用到Bootstrap、AngularJS、JQuery等;

在浏览器的数据传输格式上采用Json,非xml,同时提供RESTfulAPI;SpringMVC框架用于数据到达服务器后处理请求;到数据访问层主要有Hibernate、MyBatis、JPA等持久层框架;数据库常用MySQL;开发工具推荐IntelliJIDEA。

扩展资料:

SpringBoot所具备的特征有:

(1)可以创建独立的Spring应用程序,并且基于其Maven或Gradle插件,可以创建可执行的JARs和WARs;

(2)内嵌Tomcat或Jetty等Servlet容器;

(3)提供自动配置的“starter”项目对象模型(POMS)以简化Maven配置;

(4)尽可能自动配置Spring容器;

(5)提供准备好的特性,如指标、健康检查和外部化配置;

(6)绝对没有代码生成,不需要XML配置。

Spring的初衷:

1、JAVA EE开发应该更加简单。

2、使用接口而不是使用类,是更好的编程习惯。Spring将使用接口的复杂度几乎降低到了零。

3、为JavaBean提供了一个更好的应用配置框架。

4、更多地强调面向对象的设计,而不是现行的技术如JAVA EE。

5、尽量减少不必要的异常捕捉。

6、使应用程序更加容易测试。

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: Springboot

“起步依赖及其成功原理-Springboot (起步依赖及其原因分析)” 的相关文章

片面解析-Springboot裁减点之BeanDefinitionRegistryPostProcessor-轻松把握 (片面理解是什么意思)

片面解析-Springboot裁减点之BeanDefinitionRegistryPostProcessor-轻松把握 (片面理解是什么意思)

前言 经过这篇文章来大家分享一下,另外一个Springboot的裁减点BeanDefinitionRegistryPostProcessor,普通称这类裁减点为容器级后置处置器,另外一类是B...

Springboot-治感性能属性的机制-PropertySource-中的 (springernature)

Springboot-治感性能属性的机制-PropertySource-中的 (springernature)

SpringFramework中的PropertySource是一种用于治感性能属性的机制,它准许你将性能消息从各种起源(如属性文件、环境变量、数据库等)加载到运行程序中。在Spring中,Pro...

Springboot框架中事情监听和颁布机制详解 (springernature)

Springboot框架中事情监听和颁布机制详解 (springernature)

事情监听和颁布是SpringFramework中的一种机制,用于成功松懈耦合的组件之间的通讯。上方是事情监听和颁布的具体环节: 事情颁布的环节: 事情监听的环节: SpringF...