在百度做网站多少钱,wordpress 链接小图标,河北建设工程信息交易中心,免费网站站目录 一、代码位置
二、统一版本管理#xff08;parent#xff09;
三、提供 starter简化 Maven 配置
四、自动配置 Spring#xff08;引导类#xff09;
五、嵌入式 servlet 容器 一、代码位置 二、统一版本管理#xff08;parent#xff09;
SpringBoot项目都会继…目录 一、代码位置
二、统一版本管理parent
三、提供 starter简化 Maven 配置
四、自动配置 Spring引导类
五、嵌入式 servlet 容器 一、代码位置 二、统一版本管理parent
SpringBoot项目都会继承一个父依赖 parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.5.4/versionrelativePath/ !-- lookup parent from repository --/parent
parent 自身具有很多个版本每个 parent 版本中包含有几百个其他技术的版本号不同的parent间使用的各种
技术的版本号有可能会发生变化。当开发者使用某些技术时直接使用SpringBoot提供的 parent 就行了由
parent 帮助开发者统一的进行各种技术的版本管理整体上来说使用parent可以帮助开发者进行版本的统一管
理。项目中的pom.xml中继承了一个坐标
parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.5.4/version
/parent
打开后可以查阅到其中又继承了一个坐标
parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-dependencies/artifactIdversion2.5.4/version
/parent
这个坐标中定义了两组信息第一组是各式各样的依赖版本号属性下面列出依赖版本属性的局部可以看的出
来定义了若干个技术的依赖版本号。
propertiesactivemq.version5.16.3/activemq.versionaspectj.version1.9.7/aspectj.versionassertj.version3.19.0/assertj.versioncommons-codec.version1.15/commons-codec.versioncommons-dbcp2.version2.8.0/commons-dbcp2.versioncommons-lang3.version3.12.0/commons-lang3.versioncommons-pool.version1.6/commons-pool.versioncommons-pool2.version2.9.0/commons-pool2.versionh2.version1.4.200/h2.versionhibernate.version5.4.32.Final/hibernate.versionhibernate-validator.version6.2.0.Final/hibernate-validator.versionhttpclient.version4.5.13/httpclient.versionjackson-bom.version2.12.4/jackson-bom.versionjavax-jms.version2.0.1/javax-jms.versionjavax-json.version1.1.4/javax-json.versionjavax-websocket.version1.1/javax-websocket.versionjetty-el.version9.0.48/jetty-el.versionjunit.version4.13.2/junit.version
/properties
第二组是各式各样的依赖坐标信息可以看出依赖坐标定义中没有具体的依赖版本号而是引用了第一组信息中
定义的依赖版本属性值
dependencyManagementdependenciesdependencygroupIdorg.hibernate/groupIdartifactIdhibernate-core/artifactIdversion${hibernate.version}/version/dependencydependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion${junit.version}/version/dependency/dependencies
/dependencyManagement
上面的依赖坐标定义是出现在标签中的是对引用坐标的依赖管理并不是实际使用的坐标。
因此当我们项目中继承了这组parent信息后在不使用对应坐标的情况下前面的这组定义是不会具体导入某个
依赖的。因为在maven中继承机会只有一次上述继承的格式还可以切换成导入的形式进行。
dependencyManagementdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-dependencies/artifactIdversion${spring-boot.version}/versiontypepom/typescopeimport/scope/dependency/dependencies
/dependencyManagement
三、提供 starter简化 Maven 配置
starter定义了使用某种技术时对于依赖的固定搭配格式也是一种最佳解决方案使用starter可以帮助开发者减
少依赖配置。项目中的pom.xml定义了使用SpringMVC技术但是并没有写SpringMVC的坐标而是添加了一
个名字中包含starter的依赖
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId
/dependency
在spring-boot-starter-web中又定义了若干个具体依赖的坐标
dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter/artifactIdversion2.5.4/versionscopecompile/scope/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-json/artifactIdversion2.5.4/versionscopecompile/scope/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-tomcat/artifactIdversion2.5.4/versionscopecompile/scope/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-web/artifactIdversion5.3.9/versionscopecompile/scope/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-webmvc/artifactIdversion5.3.9/versionscopecompile/scope/dependency
/dependencies
以 spring-boot-starter-json 为例看看 starter 里面装的是什么
dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter/artifactIdversion2.5.4/versionscopecompile/scope/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-web/artifactIdversion5.3.9/versionscopecompile/scope/dependencydependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-databind/artifactIdversion2.12.4/versionscopecompile/scope/dependencydependencygroupIdcom.fasterxml.jackson.datatype/groupIdartifactIdjackson-datatype-jdk8/artifactIdversion2.12.4/versionscopecompile/scope/dependencydependencygroupIdcom.fasterxml.jackson.datatype/groupIdartifactIdjackson-datatype-jsr310/artifactIdversion2.12.4/versionscopecompile/scope/dependencydependencygroupIdcom.fasterxml.jackson.module/groupIdartifactIdjackson-module-parameter-names/artifactIdversion2.12.4/versionscopecompile/scope/dependency
/dependencies
可以发现这个starter中又包含了若干个坐标其实就是使用SpringMVC开发通常都会使用到Json使用json又
离不开这里面定义的这些坐标SpringBoot都给我们整合好了。
从而得到了一个信息使用starter可以帮开发者快速配置依赖关系。
以前写依赖3个坐标的现在导入一个就搞定极大的加速了依赖配置。
谨记
所有的starter中都会依赖下面这个starter叫做spring-boot-starter。
这个starter是所有的SpringBoot的starter的基础依赖里面定义了SpringBoot相关的基础配置
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter/artifactIdversion2.5.4/versionscopecompile/scope
/dependency
四、自动配置 Spring引导类
SpringBootApplication
public class Springboot0101QuickstartApplication {public static void main(String[] args) {SpringApplication.run(Springboot0101QuickstartApplication.class, args);}
}
SpringBoot本身是为了加速Spring程序的开发的而Spring程序运行的基础是需要创建Spring容器对象IoC容
器并将所有的对象放置到Spring容器中管理也就是一个一个的Bean。
改用 SpringBoot 就是为了加速开发Spring程序当引导类运行后就会产生一个Spring容器对象并且可以将这
个对象保存起来通过容器对象直接操作Bean。
伪代码如下
SpringBootApplication
public class Springboot0101QuickstartApplication {public static void main(String[] args) {ConfigurableApplicationContext ctx SpringApplication.run(Springboot0101QuickstartApplication.class, args);BookController bean ctx.getBean(BookController.class);System.out.println(bean bean);User user ctx.getBean(User.class);System.out.println(user);}}
通过上述操作不难看出其实SpringBoot程序启动还是创建了一个Spring容器对象。
当前运行的这个类在SpringBoot程序中是所有功能的入口称为引导类。
作为一个引导类最典型的特征就是当前类上方声明了一个注解SpringBootApplication。
五、嵌入式 servlet 容器
当前我们做的SpringBoot入门案例勾选了Spring-web的功能并且导入了对应的starter。
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId
/dependency
要做web程序肯定离不开使用web服务器SpringBoot内置的web服务器帮我们减少了 Tomcat 的配置打开
web对应的starter查看导入了哪些东西。
dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter/artifactIdversion2.5.4/versionscopecompile/scope/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-json/artifactIdversion2.5.4/versionscopecompile/scope/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-tomcat/artifactIdversion2.5.4/versionscopecompile/scope/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-web/artifactIdversion5.3.9/versionscopecompile/scope/dependencydependencygroupIdorg.springframework/groupIdartifactIdspring-webmvc/artifactIdversion5.3.9/versionscopecompile/scope/dependency
/dependencies
第三个依赖就是tomcat对应的东西了也有一个starter打开看看。
dependenciesdependencygroupIdjakarta.annotation/groupIdartifactIdjakarta.annotation-api/artifactIdversion1.3.5/versionscopecompile/scope/dependencydependencygroupIdorg.apache.tomcat.embed/groupIdartifactIdtomcat-embed-core/artifactIdversion9.0.52/versionscopecompile/scopeexclusionsexclusionartifactIdtomcat-annotations-api/artifactIdgroupIdorg.apache.tomcat/groupId/exclusion/exclusions/dependencydependencygroupIdorg.apache.tomcat.embed/groupIdartifactIdtomcat-embed-el/artifactIdversion9.0.52/versionscopecompile/scope/dependencydependencygroupIdorg.apache.tomcat.embed/groupIdartifactIdtomcat-embed-websocket/artifactIdversion9.0.52/versionscopecompile/scopeexclusionsexclusionartifactIdtomcat-annotations-api/artifactIdgroupIdorg.apache.tomcat/groupId/exclusion/exclusions/dependency
/dependencies
里面有一个核心的坐标tomcat-embed-core叫做tomcat内嵌核心。
就是这个东西把tomcat功能引入到了我们的程序中的。目前解决了第一个问题找到根儿那么谁把tomcat引入
到程序中的
经过发现是spring-boot-starter-web中的spring-boot-starter-tomcat做的。
居然什么都不做就有了web服务器对应的功能。再来说第二个问题这个服务器是怎么运行的。
内嵌Tomcat运行原理
Tomcat服务器是一款软件而且是一款使用java语言开发的软件熟悉tomcat的话应该知道tomcat安装目录中
保存有很多jar文件。既然是使用java语言开发的运行的时候肯定符合java程序运行的原理java程序运行靠的是
什么对象呀一切皆对象万物皆对象。那tomcat运行起来呢也是对象。
Spring容器就是用来管理对象的这个对象能交给Spring容器管理tomcat服务器自然而然就运行起来了
Tomcat 运行其实就是以对象的形式在Spring容器中运行的。
dependenciesdependencygroupIdorg.apache.tomcat.embed/groupIdartifactIdtomcat-embed-core/artifactIdversion9.0.52/versionscopecompile/scope/dependency
/dependencies
既然是个对象如果把这个对象从Spring容器中去掉就说明会没有web服务器的功能。
可以通过依赖排除的方式去掉这个web服务器功能。
dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactIdexclusionsexclusiongroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-tomcat/artifactId/exclusion/exclusions/dependency
/dependencies
除了通过依赖排除的方式去掉这个web服务器功能还可以更改 Servlet 容器。
其实SpringBoot提供了3款内置的服务器
tomcat(默认)apache出品粉丝多应用面广负载了若干较重的组件jetty更轻量级负载性能远不及tomcatundertow负载性能勉强跑赢tomcat
想用哪个加个坐标就行。前提是要把默认的 tomcat 排除掉因为tomcat是默认加载的。
dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactIdexclusionsexclusiongroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-tomcat/artifactId/exclusion/exclusions/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-jetty/artifactId/dependency
/dependencies