初识SpringBoot(2023最后一篇文章)

初识SpringBoot

1、SpringBoot概述

  • Spring是什么

    Spring是一个于2003 年兴起的一个轻量级开源Java开发框架,由Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》。Spring是为了解决企业级应用开发的复杂性而创建的,使用Spring可以让简单的JavaBean实现之前只有EJB才能完成的事情。但是Spring不仅仅局限于服务器端开发,任何Java应用都能在简单性、可测试性和松耦合性等方面从Spring中获益。

    Spring官网:Spring | Home

  • SpringBoot是什么

    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。

  • SpringBoot有什么用

    简化Spring的配置。

    使用Spring开发存在两个十分繁琐的地方;

    1. 依赖设置繁琐。在开发Spring程序的时候,特别是在整合SSM时,一下就要导入一大推的依赖,让我们的pom.xml文件显得很混乱
    2. 配置繁琐。在开发Spring程序时,我们通常都需要手动去编写配置类或配置文件,比如:Spring的配置文件、SpringMVC的配置文件,配置文件需要配置的东西也很多,但是大部分的东西都是可以服用的,这就显得繁琐

    Spring的核心功能:

    1. 起步依赖(简化依赖配置):依赖配置的书写简化就是靠这个起步依赖达成的
    2. 自动配置(简化常用工程相关配置):配置过于繁琐,使用自动配置就可以做响应的简化,但是内部还是很复杂的,后面具体展开说
    3. 辅助功能(内置服务器,……):除了上面的功能,其实SpringBoot程序还有其他的一些优势,比如我们没有配置Tomcat服务器,但是能正常运行,这是SpringBoot程序的一个可以感知到的功能,也是SpringBoot的辅助功能之一。一个辅助功能都能做的这么6,太牛了
  • SpringBoot的优点

    • 避免版本冲突。当一个项目使用了多个技术时,如果版本不选择正确,就会发生冲突,而SpringBoot通过parent提供了很多套技术搭配,然后我们只需要通过stater直接引入你想要的一套就行了,此时就只需要引入一个stater依赖就可以了,通过依赖传递能够引入这一套技术所有的依赖,不用像以前一样写一个Spring程序,要搞得pom.xml很混乱、臃肿

      注意praent的目的是避免依赖冲突,它提供很多套技术组合;stater的目的是减少依赖配置,只需要依赖一个stater,通过依赖传递,可以使用到其它的依赖

  • SpringBoot如何用

    参考后文👇

2、快速入门

前置须知:在创建SpringBoot项目之前,必须先安装好Maven

  • 推荐使用Maven3.6.1

方式一:直接在IDEA中创建(最常见也是最直接的方式)

创建SpringBoot项目
编写SpringBoot项目
运行SpringBoot项目
访问运行的SpringBoot项目
  • Step1:创建SpringBoot项目

image-20221216191945902

备注:这一步需要进行联网,IDEA默认是访问https://start.spring.io,这是Spring官方提供用来初始化SpringBoot项目的在线工具,它和Github一样在服务器在国外,访问起来有点慢,推荐使用国内的淘宝镜像https://start.aliyun.com/

image-20221216192132954

备注:SpringBoot2版本是当下最稳定的版本

  • Step2:编写一个SpringBoot程序:
package com.hhxy.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author ghp
 * @date 2022/12/16
 * @title
 * @description
 */
@RestController
@RequestMapping("/test")
public class TestController {

    @GetMapping
    public String test(){
        System.out.println("SpringBoot is running...");
        return "SpringBoot is running...";
    }
}

  • Step3:运行SpringBoot程序

image-20221216212343102

image-20221216211825599

  • Step4:访问SpringBoot程序

使用浏览器访问localhost:8080/test/,可以看到以下的页面:

image-20221216212213896

Spring和SpringBoot开发SpringMVC程序的比较:

类配置文件SpringSpringBoot
pom文件中的坐标手工添加勾选添加
web3.0配置类手工制作
Spring/SpringMVC配置类手工制作
控制器手工制作手工制作

Spring和SpringBoot相较而言,更加简化、精炼,现在市面上大量开发Java程序的都是选择SpringBoot


方式二:在Spring光网初始化一个SpringBoot工程

直接在SpringBoot的官网创建SpringBoot项目(IDEA本质也是使用SpringBoot官网创建Spring Boot项目的)

image-20221216220019048

方式三:手工制作

先创建一个Maven工程,然后手动编写、配置依赖

3、基础配置

3.1 基础配置

SpringBoot可以在application.properties文件中进行配置

image-20221217141449204

# 配置服务器端口号
server.port = 80

# 修改banner(banner就是那个控制台的那个Spring图标)
spring.main.banner.mode=off  # 关闭banner
spring.banner.image.laction= 图片地址 # 设置banner,回自动识别图片,然后用特殊符号进行转换,替代原来的Spring图标

# 日志
logging.level.root=info # 设置日志级别

详细配置可以参考官方文档:Spring Boot

3.2 配置文件的分类

SpringBoot的配置文件有三种格式,*.properties(默认)、*.yml(推荐)、*.yaml

三种配置文件的优先级:从左往右左边的优先级高。相同属性会根据优先级进行覆盖,不同属性则都会保留

  • YAML(YAML Ain’t a Markup Language、YAML不是一种标记语言,Yet Another Markup Language、仍是一种标记语言),可能你看着这串英文很懵,前一句想表达的意思是YAML的重心是以数据为中心,而不是像其它标记语言一样以标记为中心,后一句想表达的意思是YAML的确是一种标记语言,所以用反向缩略语重命名。它的后缀名通常为.yml.yaml

    基础语法学习站点:YAML 入门教程 | 菜鸟教程 (runoob.com)

YAML配置文件中的数据可以通过SpEL表达式进行获取

Spring Expression Language(简称 SpEL)是一种功能强大的表达式语言,支持运行时查询和操作对象图 。表达式语言一般是用最简单的形式完成最主要的工作,以此减少工作量

image-20221217151815208

image-20221217151832251

对于统一数据可以使用引用,类似于xml的${}引用

temp: student

# 进行引用
temp2: ${temp}

对于转义符的使用:需要将数据使用""包裹

temp: "a \t b"

使用自动装配,可以将配置文件中所有的数据封装到一个对象中

@Autowire
Environment env;
//得到配置文件中student下的name属性的值
env.getProperty("student.name")

一般开发中,都是需要获取指定的数据的,这里演示一下:

准备数据
创建封装类
获取数据
测试

在配置文件中准备好一个待读取的对象:

datasource:
  driver: com.mysql.cj.jdbc.Driver
  url: jdbc:mysql://localhost/springboot
  username: root
  password: 123

image-20221217155127180

image-20221217155456686


拓展:解决IDEAyaml配置文件的编写时不给提示

image-20221217143832294

image-20221217143854564

image-20221217143926393

4、整合第三方技术

4.1 整合Junit

SpringBoot默认就整合了Junit,具体步骤如下:

  • Step1:导入测试所对应的stater
  • Step2:测试类使用@SpringBootTest注解修饰
  • Step3:使用@Autowire自动装配要测试的对象
  • Step4:编写测试方法

注意事项:当测试类和引导类属于同一包下,或者属于引导类的子包下,则按照上面的步骤,可以直接进行测试;如果不符合前面所说的要求,则需要添加一个classes配置项

// 方式一:
@SpringBootTest(classes = 引导类的类名.class)
// 方式二:
@ContextConfiguration(引导类的类名.class)

备注:方式二是原生的Spring注解,SpringBoot的测试类寻找引导类只是表象,本质是要寻找到·@SpringConfiguration注解,它会现在本包及其子包下寻早是否含有某个类拥有@SpringConfiguration注解,因为这个类所标识的是类是创建IOC容器的类,测试是需要获取Bean的,这就需要先从IOC容器中获取到Bean,而这个注解是引导类特有的(需要点开@SpringBootApplication才能看到),所以就需要保障测试类能够找到引导类

4.2 整合MyBatis

创建SpringBoot工程
编写配置文件
编写Java代码
测试

前期准备:先准备好一张表,用来测试

image-20221217165944902

  • Step1:创建SpringBoot工程

    和快速入门种创建的方式差不多,只是这里需要勾选一下数据库相关的依赖,而SpringWeb的可以不配置,因为没用到。其实这里也可以不用勾选任何的东西,勾选只是为了让IDEA自动为我们添加所需要的依赖,我们也可以等工程创建完成后,直接手动在pom.xml中进行添加我们所需要的依赖

    image-20221217170044206

    SpringBooot工程目录结构:

    image-20221217170256052

  • Step2:编写配置文件

    # 配置数据连接信息
    spring:
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/springboot_study?serverTimezone=UTC
        username: root
        password: 32345678
    
  • Step3:编写Java代码

    1)编写一个实体类,用来存储数据库中的数据

    @Repository
    public class Book {
        private Integer id;
        private String type;
        private String name;
        private String description;
        
        //为节约篇幅,构造函数、get、set、toString省略了
    }
    

    2)编写一个mapper,用来执行SQL

    package com.hhxy.dao;
    
    import com.hhxy.domain.Book;
    import org.apache.ibatis.annotations.Mapper;
    import org.apache.ibatis.annotations.Select;
    
    /**
     * @author ghp
     * @date 2022/12/17
     * @title
     * @description
     */
    @Mapper
    public interface BookDao {
    
        @Select("select * from tb_book where id = #{id}")
        public Book getById(Integer id);
    }
    
  • Step4:编写测试类

    package com.hhxy;
    
    import com.hhxy.dao.BookDao;
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    
    @SpringBootTest
    class Springboot03MybatisApplicationTests {
    
        @Autowired
        private BookDao bookDao;
    
        @Test
        void contextLoads() {
            System.out.println(bookDao.getById(1));
        }
        
    }
    

    测试结果:

    image-20221217170803103

4.3 整合MyBatisPlus

MyBatisPlus的整合和MyBatis的整合类似,两者唯一不同的就是,在IDEA中无法通过勾选自动添加MyBatis的依赖(因为MyBatisPlus是国人开发的,相较而言中小型公司使用MyBatisPlus的概率要高的多)

创建SpringBoot工程
编写配置文件
编写Java代码
测试
  • Step1:创建SpringBoot工程

    此处略,和前面一样,只是这里只能勾选MySQL驱动

            <!--SpringBoot整合MyBatisPlus对应的starter-->
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>3.4.3.4</version>
            </dependency>
    
  • Step2:编写配置文件

    # 配置数据连接信息
    spring:
      datasource:
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/springboot_study?serverTimezone=UTC
        username: root
        password: 32345678
    
    
    # 设置表前缀(MyBatisPlus会自动将数据库中所有表的前缀给去掉)
    mybatis-plus:
      global-config:
        db-config:
          table-prefix: tb_
    
  • Step3:编写Java代码

    1)编写实体类

    略,和前面一样

    2)编写Mapper

    package com.hhxy.dao;
    
    import com.baomidou.mybatisplus.core.mapper.BaseMapper;
    import com.hhxy.domain.Book;
    import org.apache.ibatis.annotations.Mapper;
    import org.apache.ibatis.annotations.Select;
    
    /**
     * @author ghp
     * @date 2022/12/17
     * @title
     * @description
     */
    @Mapper
    public interface BookDao extends BaseMapper<Book> {
    }
    

    备注:BaseMapper是MyBatisPlus提供的一个类,它里面含有很多常用的方法

    image-20221217174726028

  • Step4:测试

    package com.hhxy;
    
    import com.hhxy.dao.BookDao;
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    
    @SpringBootTest
    class SpringbootApplicationTests {
    
        @Autowired
        private BookDao bookDao;
    
        @Test
        void contextLoads() {
            System.out.println(bookDao.selectById(1));
        }
    
    }
    

    测试结果:

    image-20221217174003935

4.4 整合Druid

创建SpringBoot项目
编写配置文件
编写Java代码
测试
  • Step1:创建SpringBoot项目

    和前面一致,需要勾选上MyBatis和MySQL相关依赖,Druid的依赖需要手动导入

            <!--德鲁伊数据源-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid-spring-boot-starter</artifactId>
                <version>1.2.6</version>
            </dependency>
    
  • Step2:编写配置文件

    # 配置数据连接信息
    # 方式一:
    #spring:
    #  datasource:
    #    driver-class-name: com.mysql.cj.jdbc.Driver
    #    url: jdbc:mysql://localhost:3306/springboot_study?serverTimezone=UTC
    #    username: root
    #    password: 32345678
    #    type: com.alibaba.druid.pool.DruidDataSource
    
    # 方式二:(推荐使用)
    spring:
      datasource:
        druid:
          driver-class-name: com.mysql.cj.jdbc.Driver
          url: jdbc:mysql://localhost:3306/springboot_study?serverTimezone=UTC
          username: root
          password: 32345678
    
  • Step3:编写Java代码

    1)编写实体类,略

    2)编写Mapper,略

  • Step4:测试

    略……

5、SpringBoot整合综合案例

主要实现了SSMP的整合,实现了对tb_book表的增删改查、分页展示数据,期间遇到两个bug,都是数据不同步问题:

  1. 多线程操作,一个页面删除数据,另一个页面没有来得及刷新,就去操作已删除的数据,就会导致没有反应,

    此时我们的做法是,利用finally的特点,将刷新操作(this.getAll())操作放入其中,当页面发生异常时就进行刷新

  2. 当最后一页只有一条数据时,我们将他删除,但是去执行查询操作时,当前页码仍然是之前的最后一页的页码,这就导致查询出来的数据为null,解决方法有两个

    1. 前端:我们在执行查询操作时,先对当前页码和最大页码进行一个比较,如果当前页码>最大页码,我们就重新调用一下查询操作
    2. 后端:如果当前页码>最大页码,我们就重新调用一下查询操作

示例

参考资料:

  • 黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)_哔哩哔哩_bilibili

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

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

相关文章

「微服务」微服务架构中的数据一致性

在微服务中&#xff0c;一个逻辑上原子操作可以经常跨越多个微服务。即使是单片系统也可能使用多个数据库或消息传递解决方案。使用多个独立的数据存储解决方案&#xff0c;如果其中一个分布式流程参与者出现故障&#xff0c;我们就会面临数据不一致的风险 - 例如在未下订单的情…

Linux-------rm命令超详解(狠狠爱住)

目录 rm 命令用于在Linux系统中删除指定的文件或目录 基本语法&#xff1a; 常用选项&#xff1a; 示例用法&#xff1a; 放在文末的话&#xff1a; 补充&#xff1a; rm 命令用于在Linux系统中删除指定的文件或目录 基本语法&#xff1a; rm [选项] 文件名/目录名 常用…

一个有趣的MOSFET电路-触摸调光电路

来源 刷B站视频&#xff0c;看到一个很新奇的“触摸调光电路”&#xff0c;电路图如下&#xff1a; 视频在这里&#xff0c;只使用了3个元件。 刚好最近在学模拟电路的 MOSFET&#xff0c;我之前的理解是 MOSFET 的控制电压应该加在 Gate 和 Source 之间&#xff0c;也就是 栅…

【算法】运用滑动窗口方法解决算法题(C++)

文章目录 1. 滑动窗口 介绍2. 滑动窗口算法引入209.长度最小的子数组 3. 使用滑动窗口解决算法题3.无重复字符的最长子串1004.最大连续1的个数III1658.将x减到0的最小操作数904.水果成篮LCR015.找到字符串中所有字母异位词30.串联所有单词的子串76.最小覆盖子串 1. 滑动窗口 介…

6个火爆全网的AI开源项目,用上月10万+

标题月10万可能说的有点夸张和含糊&#xff0c;10万具体指的是你可以利用这些开源项目实现&#xff1a; 访问量10万 收入10万 用户10万 …… 开源项目只是免费的工具&#xff0c;具体怎么实现还需要你根据自己需求去深入运营。这里只是给你推荐一些比较热门的开源项目&…

搞定Apache Superset

踩雷了无数次终于解决了Superset的一系列问题 现在是北京时间2023年12月27日&#xff0c;亲测有效。 Superset概述 Apache Superset是一个现代的数据探索和可视化平台。它功能强大且十分易用&#xff0c;可对接各种数据源&#xff0c;包括很多现代的大数据分析引擎&#xff…

MyBatis多表映射

1. 多表映射概念 MyBatis 思想是&#xff1a;数据库不可能永远是你所想或所需的那个样子。 我们希望每个数据库都具备良好的第三范式或 BCNF 范式&#xff0c;可惜它们并不都是那样。 如果能有一种数据库映射模式&#xff0c;完美适配所有的应用程序查询需求&#xff0c;那就太…

二叉树详解(深度优先遍历、前序,中序,后序、广度优先遍历、二叉树所有节点的个数、叶节点的个数)

目录 一、树概念及结构(了解) 1.1树的概念 1.2树的表示 二、二叉树概念及结构 2.1概念 2.2现实中的二叉树&#xff1a; 2.3数据结构中的二叉树&#xff1a; 2.4特殊的二叉树&#xff1a; 2.5 二叉树的存储结构 2.51 顺序存储&#xff1a; 2.5.2 链式存储&…

【快速全面掌握 WAMPServer】09.如何在 WAMPServer 中安装 Composer

网管小贾 / sysadm.cc WAMPServer 的大名想必应该有不少人特别是新手小白们略有耳闻吧。 它是出自法国大神之手的一款 PHP 开发环境集成包&#xff0c;工作于 Windows 环境&#xff0c;类似于它这样的集成包在 Linux 平台上反正我是没找到&#xff0c;所以它应该算是对使用 Wi…

sparkstreamnig实时处理入门

1.2 SparkStreaming实时处理入门 1.2.1 工程创建 导入maven依赖 <dependency><groupId>org.apache.spark</groupId><artifactId>spark-streaming_2.12</artifactId><version>3.1.2</version> </dependency> <dependency…

【MySQL表的增删查改】

文章目录 前言1 Create1.1 单行数据 全列插入1.2 多行数据 指定列插入1.3 插入否则更新1.4 替换 2 Retrieve2.1 SELECT 列2.1.1 全列查询2.1.2 指定列查询2.1.3 查询字段为表达式2.1.4 为查询结果指定别名2.1.5 结果去重 2.2 WHERE 条件2.2.1 英语不及格的同学及英语成绩 ( &…

CocoaPods安装及‘__rvm_make -j8‘处理

CocoaPods是一个用Ruby写的、负责管理iOS项目中第三方开源库的工具&#xff0c;CocoaPods能让我们集中的、统一管理第三方开源库&#xff0c;为我们节省设置和更新第三方开源库的时间。 安装步骤 1.查看ruby版本 ruby -v 2.通过rvm来安装或升级Ruby&#xff0c;依次执行 cu…

Apache OFBiz RCE漏洞复现(CVE-2023-51467)

0x01 产品简介 Apache OFBiz是一个电子商务平台,用于构建大中型企业级、跨平台、跨数据库、跨应用服务器的多层、分布式电子商务类应用系统。 0x02 漏洞概述 漏洞成因 该系统的身份验证机制存在缺陷,可能允许未授权用户通过绕过标准登录流程来获取后台访问权限。此外,在…

【PTA-C语言】实验七-函数与指针I

如果代码存在问题&#xff0c;麻烦大家指正 ~ ~有帮助麻烦点个赞 ~ ~ 目录——实验七-函数与指针I 6-1 弹球距离&#xff08;分数 10&#xff09;6-2 使用函数输出一个整数的逆序数&#xff08;分数 10&#xff09;6-3 使用函数求最大公约数&#xff08;分数 10&#xff09;6-4…

使用Pycharm给html文件添加浏览器

1、选择菜单栏的File---->选择setting设置 2、选择Tools(工具)---> Web Browser(web 浏览器) 勾选 自己想要添加的浏览器前面 的勾选框即可 注意点击ok进行保存

《数据结构、算法与应用C++语言描述》- 平衡搜索树 -全网唯一完整详细实现插入和删除操作的模板类

平衡搜索树 完整可编译运行代码见&#xff1a;Github::Data-Structures-Algorithms-and-Applications/_34Balanced search tree 概述 本章会讲AVL、红-黑树、分裂树、B-树。 平衡搜索树的应用&#xff1f; AVL 和红-黑树和分裂树适合内部存储的应用。 B-树适合外部存储的…

github使用技巧(经验篇)

相关经验 指定代码范围并高亮显示 例如&#xff0c;指定nn_ops.py文件2612-L2686行的代码&#xff1a;https://github.com/tensorflow/tensorflow/blob/v2.14.0/tensorflow/python/ops/nn_ops.py#L2612-L2686 FAQ Q&#xff1a;github网页打不开&#xff1f; 【github加载不…

Java项目调试实战:如何高效调试Spring Boot项目中的GET请求,并通过equalsIgnoreCase()解决大小写不一致问题

Java项目调试实战&#xff1a;如何高效调试Spring Boot项目中的GET请求&#xff0c;并通过equalsIgnoreCase解决大小写不一致问题 写在最前面全部过程Java equalsIgnoreCase() 方法idea中如何调试SpringBoot项目在IntelliJ IDEA中使用内置HTTP客户端设置断点和调试 补充&#x…

PiflowX组件-WriteToUpsertKafka

WriteToUpsertKafka组件 组件说明 以upsert方式往Kafka topic中写数据。 计算引擎 flink 有界性 Streaming Upsert Mode 组件分组 kafka 端口 Inport&#xff1a;默认端口 outport&#xff1a;默认端口 组件属性 名称展示名称默认值允许值是否必填描述例子kafka_h…

Unity坦克大战开发全流程——结束场景——通关界面

结束场景——通关界面 就照着这样来拼 写代码 hideme不要忘了 修改上一节课中的代码