起步依赖及其成功原理-Springboot (起步依赖及其原因分析)
了解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>
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、使应用程序更加容易测试。
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。