互联网应用主流框架整合之Spring Boot基本概念

Spring Boot是用来简化Spring应用程序的搭建、开发、测试和部署过程的,该框架使用了特定的方式进行配置,从而使开发人员不再需要定义样板化的配置,SpringBoot致力于快速应用开发(Rapid Application Development)领域的发展,它通过约定配置的方式,使得开发者能够更好更快的开发、测试和部署Spring应用程序

Spring Boot的特点

  • 能够创建独立的应用程序
  • 内嵌Tomcat、Jetty或Undertow不需要部署WAR文件
  • 提供自定义的启动器,通过它依赖一些常用的包,简化配置
  • 尽可能自动配置Spring应用程序和第三方库
  • 提供生产就绪功能,例如度量、运行状况检查以及外部化配置等等
  • 完全没有代码生成也无需XML配置
  1. 从开发角度看,在SpringBoot之前的Spring应用程序中,我们不需要大量的配置Bean,无论是通过XML还是注解都是如此,Spring框架在如此大量的配置情况下,就显得很不友好,而Spring Boot改进了这个问题,也是当今使用Spring开发应用程序的主要方式
  2. 从部署角度看,Spring Boot可以内嵌服务器,从而可以更快地测试和部署
  3. 从测试角度看,Spring Boot的良好封装,从而可以更加便利和快速的测试
  4. 从运维角度看,Spring Boot提供了度量,从而可以随时监控应用的运行情况

随着微服务的发展,Spring Boot选择流行的微服务组件进行封装,从而形成了Spring Cloud的各种组件,通过这些组件能够快速简单有效的开发微服务,构建大型系统

搭建Spring Boot开发环境

Eclipse

如果使用Eclipse开发Spring Boot项目,首先启动IDE
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
安装过程中会出现几次弹窗,全部勾选,然后点击右下角的信任按钮,继续安装即可,安装完成后,会弹窗重启,重启之后这个插件就能正常使用了,然后新建Spring项目
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Thymeleaf是一种视图模板技术,也是Spring Boot官方推荐使用的,目前也是主流,而Spring Web支持Spring MVC,不但会依赖Spring基础包、SpringMVC和其他常用的包,还会在依赖上内嵌Tomcat,所以只要直接运行Java程序就能启动Web了
在这里插入图片描述
点击Finish便创建完了
在这里插入图片描述

JetBrains IDEA

在这里插入图片描述
在这里插入图片描述
点击Create按钮完成Spring Boot项目的创建

运行Spring Boot

在这里插入图片描述
项目创建完成后如上图所示,其中SpringbootmybatisdemoApplication.java是项目入口文件,为了测试启动Spring Boot稍微修改一下这个问题件,让他带一些信息代码如下

package com.sbm.springbootmybatis;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;@SpringBootApplication
@RestController
public class SpringbootmybatisdemoApplication {@GetMapping("/test")public Map<String, String> test(){Map<String, String> map = new HashMap<>();map.put("hello", "world");map.put("message","Test Start Spring Boot");return map;}public static void main(String[] args) {SpringApplication.run(SpringbootmybatisdemoApplication.class, args);}
}

然后启动程序,便能看到如下图所示场景
在这里插入图片描述
然后访问地址localhost:8080/test,如下图所示
在这里插入图片描述

从这个过程可以看到,Spring Boot要比传统的Spring开发快速便捷的多

Spring Boot运转逻辑

项目创建完,看一下自动创建的pom文件,里边已经添加了一些必要的依赖,但并不多,比之前传统的Spring项目要少很多,因为每一个Spring Boot的启动器(starter)都会引入其必须和常用的包,因此就无需再由开发者一一引入,里边还有个spring-boot-starter-tomcat的依赖,这就是内嵌的Tomcat服务器,也就无需再部署Tomcat来运行Spring Boot项目了

而实际上tomcat的这个依赖即便删掉,项目还是能够成功启动的,因为spring-boot-starter-web也会依赖它,就会被加载进来, 这是SpringBoot的机制

在项目创建完后,还自动生成了一个ServletInitializer.java文件,其源码如下

/*** 自定义Spring BootServletInitializer,用于在传统的Servlet容器中部署Spring Boot应用程序。* 通过重写configure方法,指定应用程序的入口点。*/
package com.sbm;import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;public class ServletInitializer extends SpringBootServletInitializer {/*** 配置Spring Boot应用程序的构建过程。* 此方法允许我们指定应用程序的源,从而在传统的Servlet容器中启动Spring Boot应用程序。** @param application SpringApplicationBuilder实例,用于配置和构建Spring Boot应用程序。* @return SpringApplicationBuilder实例,经过配置后准备构建应用程序。*/@Overrideprotected SpringApplicationBuilder configure(SpringApplicationBuilder application) {return application.sources(SpringBmApplication.class);}}

从名字可以看出来它是用于初始化Servlet运行环境的,类继承了SpringBootServletInitializer
在这里插入图片描述
从继承图来看,SpringBootServletInitializer实现了WebApplicationInitializer接口,在之前的练习中知道只要实现了WebApplicationInitializer接口,这个类就会被Spring MVC提供的SpringServletContainerInitializer加载,用于生成SpringIoC容器,而对于SpringServletContainerInitializer而言,它实现了Servlet3.0规范的ServletContainerInitializer接口,这样在内嵌的Tomcat容器中就会被发现并且运行,进而可以运行SpringBootServletInitializer,通过这样的关系内嵌的Tomcat就可以将Spring Boot的SpringIoC容器创建出来,从而将项目运行起来

SpringBoot自定义开发

首先看一下项目结构和文件
在这里插入图片描述

  • SpringBmApplication.java:IDE生成的主类,含有Main方法,它是运行SpringBoot项目的入口,以Java Application方式运行即可启动项目
  • ServletInitializer.java:Servlet初始化,通过它来加载SpringBoot的IoC容器,将项目打包成war包放到外部服务器时,通过它初始化项目的SpringIoC容器
  • static目录:静态资源目录,如果是Web项目,那么可以放置HTML、JavaScript和CSS等静态文件
  • templates:SpringBoot默认配置的动态模板路径,默认使用Thymeleaf模板作为静态页面
  • application.properties:SpringBoot配置文件,一个常用且重要的配置文件,只是在微服务或分布式系统开发中常常使用applicaiton.yml代替它

修改一下SpringBoot配置文件,首先按照习惯将application.properties改为application.yml,然后在文档中添加如下代码

# 应用程序名称,用于标识和区分不同的Spring Boot应用程序
spring.application.name:- SpringBM# 服务器配置
server:# Servlet上下文路径,定义了应用程序访问的根路径servlet:context-path: /SpringBM# 服务器端口,指定应用程序监听的端口号port: 8001

然后重启服务器,并访问连接http://localhost:8001/SpringBM/testStart得到如下结果
在这里插入图片描述
配置文件的配置项都是由Spring Boot的starter提供的,它采用的核心思想是约定优于配置,在默认的情况下,可以直接启动项目,在需要时再进行修改

然后看一下Thymeleaf的使用过,首先创建一个/resources/templates/hello.html文件,文件中内容如下所示

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/><title>Thymeleaf模板</title>
</head>
<body>
<!-- 使用标签读取数据模型 -->
<p th:text="${name} + ',hello world!!'"></p>
</body>
</html>

其中${name}是一个Spring表达式,意思是从数据模型中读取以"name"为名的属性,然后再开发一个控制器,代码如下

package com.sbm.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;// REST风格控制器
@RestController
public class HelloController {/*** 控制器方法* @param name 姓名* @return 视图和模型,指向Thymeleaf模板*/@GetMapping("/hello/{name}")public ModelAndView sayHello(@PathVariable("name") String name) {ModelAndView mav =new ModelAndView("hello");mav.addObject("name", name);return mav;}
}

代码返回一个名为"hello"的视图,并且绑定了对应的数据模型,视图名会去映射Thymeleaf模板,这是Spring Boot的默认配置,它对应的是在/resouces/templates/目录下的HTML文件,只要名称为hello就会对应上

SpringBoot的入口文件和刚刚的控制器不在同一个包下,需要另行配置才能扫描它,按照传统的Spring方法使用@ComponentScan是可行的,但在SpringBoot里可以通过注解@SpringBootApplicationscanBasePackage配置项,如下代码所示

package com.sbm;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;
import java.util.Map;@SpringBootApplication(scanBasePackages = "com.sbm")
@RestController
public class SpringBmApplication {@GetMapping("/testStart")public Map<String, String> testStart() {Map<String, String> map = new HashMap<>();map.put("message", "Hello, World!");map.put("status", "OK");return map;}public static void main(String[] args) {SpringApplication.run(SpringBmApplication.class, args);}}

然后重启SpringBoot,访问连接http://localhost:8001/SpringBM/hello/Davieyang.D.Y在这里插入图片描述
如果不适用Themeleaf模板,而是使用传统的JSP,还需要做如下配置,首先注释掉或者删掉Themeleaf在POM中的依赖配置,然后添加如下依赖,否者SpringBoot还是走Themeleaf模板,访问jsp文件会报错

        <!-- Tomcat对JSP的依赖 --><dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-jasper</artifactId></dependency><!-- Servlet环境支持 --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version><scope>provided</scope></dependency>

spring-boot-starter-tomcat只是内嵌Tomcat容器,不包含对JSP解析的支持,因此需要引入这两个依赖,然后编写控制器代码

package com.sbm.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;@RestController
@RequestMapping("/jsp")
public class JspPageController {@GetMapping("/welcome/{name}")public ModelAndView welcome(@PathVariable("name") String name) {ModelAndView mav = new ModelAndView("index");mav.addObject("name", name);return mav;}
}

然后在resources同级目录下新建/WEB-INF/jsp/index.jsp文件,并写入如下代码

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>在Spring Boot中使用JSP</title>
</head>
<body>
<h1><%=request.getAttribute("name")%>, 欢迎来到Spring Boot的世界</h1>
</body>
</html>

有了控制器和视图,接下来配置视图解析器,在Spring传统的开发中,还需要自己创建视图解析器,但在SpringBoot中,仅仅需要配置,在application.yml文件中加入如下代码

# 应用程序名称,用于标识和区分不同的Spring Boot应用程序
spring.application.name:- SpringBM# 服务器配置
server:# Servlet上下文路径,定义了应用程序访问的根路径servlet:context-path: /SpringBM# 服务器端口,指定应用程序监听的端口号port: 8001spring:mvc:view:# 视图解析器前缀prefix: /WEB-INF/jsp/# 视图解析器后缀suffix: .jsp

然后重启SpringBoot,并访问http://localhost:8001/SpringBM/jsp/welcome/Davieyang.D.Y
在这里插入图片描述

内嵌的服务器、简易的依赖快速的开发都是Spring Boot所带来的的好处,在当前流行的Java微服务架构中,SpringBoot是基石,并且基于SpringBoot,还有许多微服务的组件,在构建微服务架构时也便利了许多

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/30982.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RTSP/Onvif安防监控平台EasyNVR抓包命令tcpdump使用不了的解决方法

安防视频监控汇聚EasyNVR智能安防视频监控平台&#xff0c;是基于RTSP/Onvif协议的安防视频平台&#xff0c;可支持将接入的视频流进行全平台、全终端分发&#xff0c;分发的视频流包括RTSP、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等格式。平台可提供的视频能力包括&#xff1a;…

vscode插件开发之 - TestController

TesController概要介绍 TestController 组件是用于实现自定义测试框架和集成测试结果的。它允许开发者定义自己的测试运行器&#xff0c;以支持在VSCode中运行和展示测试。以下是一些使用 TestController 组件的主要场景&#xff1a; 自定义测试框架&#xff1a;如果你正在开发…

C++语法19 循环嵌套结构(for/while循环)

语法阶段已经更新到第18章了&#xff0c;前面的知识你都学会了吗&#xff1f;如果还没有学习前面的知识&#xff0c;请点击&#x1f449;语法专栏进行学习哦&#xff01; 目录 循环嵌套 训练&#xff1a;数字矩形 解析 参考代码 训练&#xff1a;星号三角形 解析 参考代码 …

Scikit-Learn梯度提升决策树(GBDT)

Scikit-Learn梯度提升决策树 1、梯度提升决策树(GBDT)1.1、Boosting方法1.2、GBDT的原理1.3、GBDT回归的损失函数1.4、梯度下降与梯度提升1.5、随机森林与GBDT1.6、GBDT的优缺点2、Scikit-Learn梯度提升决策树(GBDT)2.1、Scikit-Learn GBDT回归2.1.1、Scikit-Learn GBDT回归…

【车载开发系列】CAN通信总线再理解(中篇)

【车载开发系列】CAN通信总线再理解&#xff08;中篇&#xff09; 九. CAN总线标准十. CAN物理层十一. CAN数据链路层1&#xff09;CAN的通信帧类型2&#xff09;CAN的标准帧格式1. CAN ID2. 数据场 3&#xff09;CAN总线仲裁 十二. CAN应用层1&#xff09;CANopen2&#xff09…

《车载以太网通信测试》课程来袭!!!

本课程包含教程和脚本两部分内容。 教程 详细介绍以太网&#xff0c;如何理解TCP/IP协议&#xff0c;CAPL中涉及以太网的代码&#xff0c;以太网测试环境如何搭建&#xff0c;从物理层、链路层、网络层、传输层到应用层多种协议测试点的测试原理和测试方法介绍&#xff0c;中…

西门子学习笔记12 - BYTE-REAL互相转化

这是针对于前面MQTT协议的接收和发送数组只能是BYTE数组做出的对应的功能块封装。 1、BYTE-REAL转化 1、把byte数组转成字符串形式 2、把字符串转成浮点数 2、REAL-BYTE转化 1、把浮点数转成字符串 2、把字符串转成Byte数组

【转载】TIOBE 编程指数 6 月排行榜公布,vb.net排第九

原文地址&#xff1a;https://baijiahao.baidu.com/s?id1801368030428902126&wfrspider&forpc IT之家 6 月 9 日消息&#xff0c;TIOBE 编程社区指数是一个衡量编程语言受欢迎程度的指标&#xff0c;评判的依据来自世界范围内的工程师、课程、供应商及搜索引擎&#…

乐鑫esp32系列睡眠模式下蓝牙连接功耗测试,新支持ESP-C6,启明云端乐鑫代理商

本教程适用于ESP32-S3、ESP32-C3、ESP32-C6&#xff1b; 睡眠模式介绍 ESP32系列常见的休眠方式有三种&#xff0c;分别为Modem-sleep、Light-sleep 和 Deep-sleep。 Modem-sleep模式&#xff1a;CPU 正常工作&#xff0c;可以对时钟进行配置。 进入 Modem-sleep 模式后&…

大模型与知识图谱:联合打造智能未来,案例解析让你大开眼界!

在数字化浪潮中&#xff0c;大模型和知识图谱作为人工智能领域的两大核心技术&#xff0c;正逐渐改变着我们的生活。大模型&#xff0c;是一种通过大规模数据训练得到的深度学习模型&#xff0c;具备强大的语义理解和推理能力&#xff1b;而知识图谱&#xff0c;则是以图状结构…

光伏设计需要设计哪些方面?

光伏设计是一项复杂而关键的工作&#xff0c;它涉及到多个方面的综合考虑&#xff0c;以确保光伏系统的效率、安全性和可持续性。下面将详细探讨光伏设计需要设计的几个方面。 一、系统规模与布局 光伏设计的首要任务是确定系统的规模和布局。这包括评估安装地点的光照资源、可…

【nginx】 nginx核心功能

【nginx】 nginx核心功能 1.nginx核心功能 1. 反向代理 2. 负载均衡 3. 动静分离 4. nginx的高可用2. 反向代理 正向代理: 该服务器代理的是客户端&#xff0c;对于服务器来说&#xff0c;不知道真实客户端的ip。比如: 翻墙软件。 访问国外的服务器---使用了翻墙软件----对…

Vue 使用setInterval定时器导致前端页面卡死(解决方法)

Vue 使用setInterval定时器导致前端页面卡死 原因 setinterval不会清除定时器队列&#xff0c;每重复执行1次都会导致定时器叠加&#xff0c;最终卡死你的网页。 其原因与JS引擎线程有关&#xff08;需深入研究JS引擎线程&#xff09; &#xff0c;但是setTimeout是自带清除定…

同城跑腿多合一系统源码小程序支持安卓+IOS+公众号+H5

&#x1f680; 同城跑腿多合一小程序&#xff1a;便捷生活新选择 &#x1f4a8; 一、引言&#xff1a;走进便捷新纪元 在这个快节奏的现代生活中&#xff0c;时间成了最宝贵的财富。而“同城跑腿多合一小程序”正是为了满足大家对于便捷、高效生活的追求而诞生的。它不仅是一款…

RapidLayout:中英文版面分析推理库

引言 继上一篇文章之后&#xff0c;我这里想着将360发布的版面分析模型整合到现有的rapid_layout仓库中&#xff0c;便于大家快速使用。 不曾想到&#xff0c;我这整理工作越做越多了&#xff0c;好在整体都是往更好方向走。 起初&#xff0c;rapid_layout项目是在RapidStru…

vue3页面传参

一&#xff0c;用query传参 方法&#xff1a; router.push({path: ‘路由地址’, query: ‘参数’}) 例子&#xff1a;a页面携带参数跳转到b页面并且b页面拿到a页面传递过来的参数 在路由router.ts配置 a页面&#xff1a; <template><div >a页面</div>…

【可控图像生成系列论文(二)】MimicBrush 港大、阿里、蚂蚁集团合作论文解读2

【可控图像生成系列论文&#xff08;一&#xff09;】简要介绍了论文的整体流程和方法&#xff0c;本文则将就整体方法、模型结构、训练数据和纹理迁移进行详细介绍。 1.整体方法 MimicBrush 的整体框架如下图所示。为了实现模仿编辑&#xff0c;作者设计了一种具有双扩散模型…

SpingBoot快速入门下

响应HttpServietResponse 介绍 将ResponseBody 加到Controller方法/类上 作用&#xff1a;将方法返回值直接响应&#xff0c;如果返回值是 实体对象/集合&#xff0c;将会自动转JSON格式响应 RestController Controller ResponseBody; 一般响应 统一响应 在实际开发中一般…

DS1339C串行实时时钟-国产兼容RS4C1339

RS4C1339串行实时时钟是一种低功耗的时钟/日期设备&#xff0c;具有两个可编程的一天时间报警器和一个可编程方波输出。地址和数据通过2线双向总线串行传输。时钟/日期提供秒、分钟、小时、天、日期、月份和年份信息。对于少于31天的月份&#xff0c;月末的日期会自动调整&…

PDO预编译与sql注入

刚学web安全的时候学到sql注入防御&#xff0c;那些文章基本上都会说利用pdo预编译就可以近乎完美防御sql注入&#xff0c;或者看到一些渗透经验贴&#xff0c;遇到sql经过预编译的网站师傅们总是会建议赶紧换个站&#xff0c;那么预编译究竟能不能完美防御sql注入&#xff0c;…