互联网应用主流框架整合之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实例,经过配置后准备构建应用程序。
     */
    @Override
    protected 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: 8001


spring:
  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.mfbz.cn/a/727264.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

这些帮助你成长的IOS应用,建议收藏

TrackIt TrackIt是一款功能丰富的任务清单、日程管理和习惯打卡应用&#xff0c;旨在帮助用户提高效率和专注力。通过这些功能&#xff0c;用户可以更好地规划时间和任务&#xff0c;从而实现个人目标和养成良好习惯。 在目标设定方面&#xff0c;SMART原则是一个常用的方法&a…

【CPP】选择排序:冒泡排序、快速排序

目录 1.冒泡排序简介代码分析 2.快速排序2.1霍尔版本简介代码分析 2.2挖坑版本2.3前后指针版本2.4非递归的快排思路代码 什么是交换排序&#xff1f; 基本思想&#xff1a;所谓 交换&#xff0c;就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置&#xff0…

Meta FAIR研究新成果:图像到文本、文本到音乐的生成模型,多标记预测模型以及AI生成语音检测技术

Meta AI研究实验室(FAIR)公开发布了多项新研究成果&#xff0c;包括图像到文本和文本到音乐的生成模型&#xff0c;多词预测模型&#xff0c;以及检测AI生成语音的技术。发布的成果体现了开放性、协作、卓越和规模化等核心原则。公开早期研究工作旨在激发迭代&#xff0c;推动A…

uniapp 实人认证

首先Dcloud创建云服务空间&#xff0c;开启一键登录并充值 下一步 1. 右键项目 》 创建uniCloud云开发环境 》右键uniCloud》关联云服务空间 2. cloudfunctions右键 新建云函数&#xff0c;任意命名&#xff08;例&#xff1a;veify&#xff09;&#xff0c;然后右键项目》管…

加密好的WPSword文档,忘记密码怎么办?

在日常办公和学习中&#xff0c;我们经常使用WPS Word等文档处理软件来创建和编辑重要文件。为了保护这些文件不被未经授权的人访问&#xff0c;我们通常会选择给文档设置密码。然而&#xff0c;有时我们可能会因为时间久远或其他原因而忘记自己设置的密码&#xff0c;这时该如…

IT运维全面数字化|芯片设计行业领跑打造运维流程闭环

在当今数字化转型的浪潮中&#xff0c;科技行业正经历着前所未有的变革。随着5G、人工智能、物联网等新兴技术的快速发展&#xff0c;企业对于高效、智能的运营模式的需求日益迫切。 芯片设计公司作为科技产业链中的关键一环&#xff0c;不仅要在技术创新上保持领先&#xff0…

javascript--类型检测 type of 和 instanceof

类型判断 1、typeof2、instanceof**instanceof 的原理** 3、constructor 1、typeof typeof在检测null、object、array、data的结果中都是object&#xff0c;所以无法用来区分这几个类型的区别。 <script>let a ["123",123,false,true,Symbol(1),new Date(),n…

双层循环和循环语句

echo 打印 echo -n 表示不换行输出 echo -e 表示输出转义字符 echo \b 相当于退格键&#xff08;backspace&#xff09; echo \n 换行&#xff0c;相当于回车 echo \f 换行&#xff0c;换行后的新行的开头连着上一行的行尾 echo \t 相当于tab健 &#xff08;…

Linux基础命令大全(详解版)

Linux基础命令&#xff08;详解版&#xff09; 文章目录 Linux基础命令&#xff08;详解版&#xff09;1.Linux的目录结构**2.Linux路径的描述方式**3.Linux命令基础格式4.ls命令 隐藏文件、文件夹5.pwd命令6.cd命令 特殊路径符7.mkdir命令 文件操作命令8.touch命令9.cat命令10…

DB9母头接口定义485

在通信技术中&#xff0c;DB9接口广泛应用于串行通信&#xff0c;尤其是在RS232和RS485标准中。虽然DB9接口最常见于RS232通信&#xff0c;但通过适当的引脚映射&#xff0c;它也可以用于RS485通信。本文将详细介绍如何定义和使用DB9母头接口进行RS485连接。 DB9母头接口简介 …

Ecahrts竖向柱状图实现自动滚动

效果如下&#xff1a; 1.首先声明一个timer定时器标识 let timer: NodeJS.Timer; // 定时器 2.再声明窗口展示的数量&#xff0c;yAxisIndex2用来记录当前index已经加了多少&#xff0c;方便再formatter中格式化标题的相关信息 const dataZoomEndValue 6; // 数据窗口范围的…

C语言程序设计-7 数组

在程序设计中&#xff0c;为了处理方便&#xff0c;把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。在&#xff23;语言中&#xff0c;数组属于构造数据类型。一个数 组可以分解为多个数组元素&#xff0c;这些数组元素可以是基本数…

Hive笔记-3

3.2.2 查看表 1) 展示所有表 (1) 语法: 语法: SHOW TABLES [IN database_name] LIKE [identifier_with_wildcards]; In database_name 写的是查哪个数据库,一般不写默认是当前数据库 Like 后面跟通配符表达式 (2) 案例: 查看在 db_hive1 数据库里有没有以 stu 开头的表 …

DeviceNet总线粗缆和细缆连接器

DeviceNet总线粗缆和细缆连接器 DeviceNet的粗缆和细缆连接器是网络中不可或缺的部分&#xff0c;它们负责将不同的设备连接起来&#xff0c;实现数据的传输。粗缆通常用于主干线路&#xff0c;而细缆则用于分支线路。粗缆和细缆的芯位分布有所不同&#xff0c;粗缆通常有五个…

申办乙级资信证书,河南工程咨询单位流程详解

河南工程咨询单位申办乙级资信证书的流程详解如下&#xff1a; 一、前期准备阶段 研读政策文件&#xff1a; 研读《工程咨询行业管理办法》&#xff08;国家发展改革委2017年第9号令&#xff09;以及《国家发展改革委关于印发<工程咨询单位资信评价标准>的通知》&#x…

【嵌入式Linux】<总览> 文件IO(更新中)

文章目录 前言 一、常用函数 1. open函数 2. close函数 3. write函数 4. read函数 5. dup函数 6. dup2函数 二、文件读写细节 1. 换行符 2. 文件描述符 3. errno和perror 前言 在Linux系统中&#xff0c;一切皆文件。因此&#xff0c;掌握Linux下文件IO常用的函数…

高效电商数据分析:电商爬虫API与大数据技术的融合应用

一、引言 随着电子商务的迅猛发展和数据量的爆炸式增长&#xff0c;电商数据分析已成为企业决策的关键依据。在竞争激烈的电商市场中&#xff0c;如何高效、准确地获取并分析数据&#xff0c;以洞察市场趋势、优化运营策略、提升用户体验&#xff0c;成为电商企业面临的重要挑…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 连续字母长度(100分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

3D Web轻量化引擎HOOPS Commuicator是如何创建AEC查看器的?

在当今数字化时代&#xff0c;建筑、工程和施工&#xff08;AEC&#xff09;行业正经历着一场技术革命。HOOPS Communicator&#xff0c;一款基于HOOPS Web平台的3D Web轻量化引擎&#xff0c;正是这场革命的先锋之一。本文将探讨HOOPS Communicator是如何创建AEC查看器的&…

[论文笔记]Are Large Language Models All You Need for Task-Oriented Dialogue?

引言 今天带来论文Are Large Language Models All You Need for Task-Oriented Dialogue?的笔记。 主要评估了LLM在完成多轮对话任务以及同外部数据库进行交互的能力。在明确的信念状态跟踪方面&#xff0c;LLMs的表现不及专门的任务特定模型。然而&#xff0c;如果为它们提…