SpringBoot基础篇

86 阅读11分钟

01-SpringBoot入门案例(Idea联网版)

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

    • 创建新模块,选择Spring Initializr,并配置模块相关基础信息 image.png
    • 选择当前模块需要使用的技术集 image.png
    • 开发控制器类
    less
    复制代码
    //Rest 模式
    @RestController
    @RequestMapping("/books")
    public class BookController {
        @GetMapping
        public String getById() {
            System.out.println("springboot is running...");
            return "springboot is running...";
        }
    }
    
  • 最简SpringBoot程序所包含的基础文件 (pom.xml文件 和 Application类 )

    • pom.xml文件
    xml
    复制代码
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    
    // parent
    <parent>
        // starter
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.6</version>
    </parent>
    
    <groupId>com.example</groupId>
    <artifactId>springboot-01-quickstart</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    
    // 依赖
    <dependencies>
        // starter
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        // 测试库
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    
    </project>
    
    • Application类
    typescript
    复制代码
    @SpringBootApplication
        public class Springboot0101QuickstartApplication {
               public static void main(String[] args) {
               SpringApplication.run(Springboot0101QuickstartApplication.class, args);
               }
        }
    
  • Spring程序与SpringBoot程序对比 image.png 注意: 基于idea开发SpringBoot程序需要确保联网且能够加载到程序框架结构

小结:

  1. 开发SpringBoot程序可以根据向导进行联网快速制作
  2. SpringBoot程序需要基于JDK8进行制作
  3. SpringBoot程序中需要使用何种功能通过勾选选择技术
  4. 运行SpringBoot程序通过运行Application程序入口进行

02-教你一招:隐藏文件或文件夹

  • 可以隐藏的文件 image.png
  1. Idea中隐藏指定文件或指定类型文件
  2. Setting → File Types → Ignored Files and Folders
  3. 输入要隐藏的文件名,支持*号通配符
  4. 回车确认添加 image.png

03-入门案例解析:parent

image.png

  • porm.xml文件parent节点
xml
复制代码
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.5.6</version>
</parent>
  • 按住Ctrl点击pom.xml中的spring-boot-starter-parent,跳转到了2.5.6版本spring-boot-starter-parentpom.xml
xml
复制代码
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.5.6</version>
</parent>
  • 按住Ctrl点击pom.xml中的spring-boot-starter-dependencies,跳转到了2.5.6版本spring-boot-starter-dependenciespom.xml
xml
复制代码
<properties>
    <activemq.version>5.15.3</activemq.version>
    <antlr2.version>2.7.7</antlr2.version>
    <appengine-sdk.version>1.9.63</appengine-sdk.version>
    <artemis.version>2.4.0</artemis.version>
    <aspectj.version>1.8.13</aspectj.version>
    <assertj.version>3.9.1</assertj.version>
    <atomikos.version>4.0.6</atomikos.version>
    <bitronix.version>2.1.4</bitronix.version>
    <build-helper-maven-plugin.version>3.0.0</build-helper-maven-plugin.version>
    <byte-buddy.version>1.7.11</byte-buddy.version>
    ... ... ...
</properties>

从上面的spring-boot-starter-dependenciespom.xml中我们可以发现,一部分坐标的版本、依赖管理、插件管理已经定义好,所以我们的SpringBoot工程继承spring-boot-starter-parent后已经具备版本锁定等配置了。所以起步依赖的作用就是进行依赖的传递。

  • 小结:

    1. 开发SpringBoot程序要继承spring-boot-starter-parent
    2. spring-boot-starter-parent中定义了若干个依赖管理
    3. 继承parent模块可以避免多个依赖使用相同技术时出现依赖版本冲突
    4. 继承parent的形式也可以采用引入依赖的形式实现效果

04-入门案例解析:starter

  • spring-boot-starter-web.pom

    • 按住Ctrl点击pom.xml中的spring-boot-starter-web,跳转到了spring-boot-starter-webpom.xmlxml配置如下(只摘抄了部分重点配置):
xml
复制代码
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <version>5.0.5.RELEASE</version>
    <scope>compile</scope>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.0.5.RELEASE</version>
    <scope>compile</scope>
</dependency>

从上面的spring-boot-starter-webpom.xml中我们可以发现,spring-boot-starter-web就是将web开发要使用的spring-webspring-webmvc等坐标进行了“打包”,这样我们的工程只要引入spring-boot-starter-web起步依赖的坐标就可以进行web开发了,同样体现了依赖传递的作用 image.png

  • starter

    • SpringBoot中常见项目名称,定义了当前项目使用的所有依赖坐标,以达到减少依赖配置的目的
  • parent

    • 所有SpringBoot项目要继承的项目,定义了若干个坐标版本号(依赖管理,而非依赖),以达到减少依赖冲突的目的。
    • spring-boot-starter-parent各版本间存在着诸多坐标版本不同
  • 实际开发

    • 使用任意坐标时,仅书写GAV(groupId, artifactId, version)中的G和A,V由SpringBoot提供,除非SpringBoot未提供对应版本V
    • 如发生坐标错误,再指定Version(要小心版本冲突)

05-入门案例解析:引导类

arduino
复制代码
@SpringBootApplication
public class Springboot0101QuickstartApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext ctx = SpringApplication.run(Springboot0101QuickstartApplication.class, args);
        //获取bean对象
        BookController bean = ctx.getBean(BookController.class);
        System.out.println("bean======>" + bean);
    }
}
  • SpringBoot的引导类是Boot工程的执行入口,运行main方法就可以启动项目
  • SpringBoot工程运行后初始化Spring容器,扫描引导类所在包加载bean

06-入门案例:辅助功能

  • 辅助功能 内嵌tomcat image.png
  • 使用maven依赖管理变更起步依赖项
xml
复制代码
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <!--web 起步依赖环境中,排除 Tomcat 起步依赖 -->
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- 添加 Jetty 起步依赖,版本由 SpringBoot 的 starter 控制 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jetty</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
  • Jetty比Tomcat更轻量级,可扩展性更强(相较于Tomcat),谷歌应用引擎(GAE)已经全面切换为Jetty

  • 内置服务器

    • tomcat(默认) apache出品,粉丝多,应用面广,负载了若干较重的组件
    • jetty 更轻量级,负载性能远不及tomcat
    • undertow undertow,负载性能勉强跑赢tomcat
  • 小结:

    1. 内嵌Tomcat服务器是SpringBoot辅助功能之一
    2. 内嵌Tomcat工作原理是将Tomcat服务器作为对象运行,并将该对象交给Spring容器管理
    3. 变更内嵌服务器思想是去除现有服务器,添加全新的服务器

[补]知识加油站-01-REST风格简介

  • 什么是 rest

    • REST(Representational State Transfer)表现形式状态转换
  • 传统风格资源描述形式

  • REST风格描述形式

  • 优点:

    • 隐藏资源的访问行为, 无法通过地址得知对资源是何种操作
    • 书写简化
  • 按照REST风格访问资源时使用行为动作区分对资源进行了何种操作

  • 注意:

    • 上述行为是约定方式,约定不是规范,可以打破,所以称REST风格,而不是REST规范
    • 描述模块的名称通常使用复数,也就是加s的格式描述,表示此类资源,而非单个资源,例如: users、 books、 accounts…

[补]知识加油站-02-RESTful入门案例

  • 设定http请求动作(动词)
    • 使用 @RequestMapping 注解的 method 属性声明请求的方式
    • 使用 @RequestBody 注解 获取请求体内容。直接使用得到是 key=value&key=value…结构的数据。get 请求方式不适用。
    • 使用@ResponseBody 注解实现将 controller 方法返回对象转换为 json 响应给客户端。 image.png
  • 设定请求参数(路径变量)
    • 使用@PathVariable 用于绑定 url 中的占位符。例如:请求 url 中 /delete/{id},这个{id}就是 url 占位符。 image.png
  • @RequestMapping

image.png

  • @PathVariable

image.png

  • @RequestBody @RequestParam @PathVariable

image.png

[补]知识加油站-03-RESTful快速开发

  • 使用 @RestController 注解开发 RESTful 风格

image.png

  • 使用 @GetMapping @PostMapping @PutMapping @DeleteMapping 简化 @RequestMapping 注解开发

image.png

13-属性配置方式

  • 修改服务器端口 image.png
  • SpringBoot默认配置文件application.properties,通过键值对配置对应属性
ini
复制代码
# 服务器端口配制 
server.port=80

07-基础配置

ini
复制代码
# 修改banner 
# spring.main.banner-mode=off 
# spring.banner.image.location=logo.png 

# 日志 
logging.level.root=info

15-3种配置文件类型

  • SpringBoot提供了多种属性配置方式,yml是主流格式image.png

16-配置文件加载优先级

  • SpringBoot配置文件加载顺序

    • application.properties > application.yml > application.yaml
  • 常用配置文件种类

    • application.yml

17-教你一招:属性提示消失解决方案

image.png image.png

  • 指定SpringBoot配置文件

    • SettingProject StructureFacets
  • 选中对应项目/工程

    • Customize Spring Boot
  • 选择配置文件

18-yaml数据格式

  • YAML(YAML Ain’t Markup Language),一种数据序列化格式

  • YAML文件扩展名.yml.yaml

  • 基本语法

    • key: value -> value 前面一定要有空格
    • 大小写敏感
    • 属性层级关系使用多行描述,每行结尾使用冒号结束
    • 使用缩进表示层级关系,同层级左侧对齐,只允许使用空格(不允许使用Tab键)
    • 属性值前面添加空格(属性名与属性值之间使用冒号+空格作为分隔)
    • 表示注释

    • 核心规则:数据前面要加空格与冒号隔开
  • 数据类型 image.png

  • 数组表示方式:在属性名书写位置的下方使用减号作为数据开始符号,每行书写一个数据,减号与数据间空格分隔 image.png

19-读取使用@Value读取单个数据,属性名引用方式:${一级属性名.二级属性名……}

image.png

  • 使用@Value配合SpEL读取单个数据
  • 如果数据存在多层级,依次书写层级名称即可

20-yaml文件中的变量引用

  • 在配置文件中可以使用属性名引用方式引用属性 image.png

21-读取yaml全部属性数据

  • 封装全部数据到Environment对象
  • 需要标签Autowired,表示自动装配 image.png

22-读取yaml引用类型属性数据

  • 自定义对象封装指定数据
  • @component表示将MyDataSaource定义为spring管控的bean 截屏2023-01-20 15.49.04.png image.png
  • 使用自动装配封装指定数据
kotlin
复制代码
@Autowired 
private MyDataSource myDataSource;

System.out.println(myDataSource);

23-SpringBoot整合JUnit

  • 添加Junit的起步依赖 Spring Initializr 创建时自带
xml
复制代码
<!--测试的起步依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
  • SpringBoot整合JUnit
typescript
复制代码
@SpringBootTest //设置JUnit加载的SpringBoot启动类
class Springboot07JunitApplicationTests {
    @Autowired //使用自动装配的形式添加要测试的对象
    private BookService bookService;
    
    @Test //需要自动测试的函数
    public void testSave(){
        bookService.save();
    }
}

24-整合JUnit——classes属性

  • 测试类如果不存在于引导类所在的包或子包中,需要通过 classes 属性指定引导类。
java
复制代码
@SpringBootTest(classes = Springboot04JunitApplication.class)
//@ContextConfiguration(classes = Springboot04JunitApplication.class)
class Springboot04JunitApplicationTests {
  
    @Autowired //1.注入你要测试的对象
    private BookDao bookDao;

    @Test
    void contextLoads() {
        //2.执行要测试的对象对应的方法
        bookDao.save();
        System.out.println("two...");
    }
}

25-SpringBoot整合MyBatis

  • 创建新模块,选择Spring初始化,并配置模块相关基础信息 image.png
  • 选择当前模块需要使用的技术集(MyBatisMySQLimage.png
  • 设置数据源参数
yaml
复制代码
#DB Configuration:
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/springboot_db
    username: root
    password: 123456
  • 在 springboot_db 数据库中创建 user 表
sql
复制代码
-- ----------------------------
-- Table structure for `user`
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) DEFAULT NULL,
  `password` varchar(50) DEFAULT NULL,
  `name` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'zhangsan', '123', '张三');
INSERT INTO `user` VALUES ('2', 'lisi', '123', '李四');
  • 创建实体Bean
arduino
复制代码
public class User {
    // 主键
    private Long id;
    // 用户名
    private String username;
    // 密码
    private String password;
    // 姓名
    private String name;
  
    //此处省略getter,setter,toString方法 .. ..   
}
  • 定义数据层接口与映射配置
kotlin
复制代码
@Mapper // 如果在接口类上添加了@Mapper,在编译之后会生成相应的接口实现类。
public interface UserDao { 
    @Select("select * from user") 
    public List<User> getAll(); 
}
  • 测试类中注入dao接口,测试功能
ruby
复制代码
@SpringBootTest
class Springboot05MybatisApplicationTests {
    @Autowired
    private UserDao userDao;

    @Test
    void contextLoads() {
        List<User> userList = userDao.getAll();
        System.out.println(userList);
        // [User{id=1, username='zhangsan', password='123', name='张三'}, User{id=2, username='lisi', password='123', name='李四'}]
    }
}

总结:

  1. 勾选MyBatis技术,也就是导入MyBatis对应的starter
  2. 数据库连接相关信息转换成配置
  3. 数据库SQL映射需要添加@Mapper被容器识别到

26-SpringBoot整合MyBatis常见问题处理

  • SpringBoot版本低于2.4.3(不含),Mysql驱动版本大于8.0时,需要在url连接串中配置时区
bash
复制代码
jdbc:mysql://localhost:3306/springboot_db?serverTimezone=UTC
  • 或在MySQL数据库端配置时区解决此问题

    • MySQL 8.X驱动强制要求设置时区

      • 修改url,添加serverTimezone设定
      • 修改MySQL数据库配置(略)
    • 驱动类过时,提醒更换为com.mysql.cj.jdbc.Drive

27-SpringBoot整合MyBatisPlus

  • 手动添加SpringBoot整合MyBatis-Plus的坐标,可以通过mvnrepository获取。由于SpringBoot中未收录MyBatis-Plus的坐标版本,需要指定对应的Version
xml
复制代码
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.3</version>
</dependency>
  • 数据层接口使用BaseMapper简化开发,定义数据层接口与映射配置,继承BaseMapper
java
复制代码
@Mapper 
public interface UserDao extends BaseMapper<User> { 
    // 构建时,会自动生成对应user的增删查改函数
}
  • 其他同SpringBoot整合MyBatis
  • 测试类中注入dao接口,测试功能
ruby
复制代码
@SpringBootTest
class Springboot06MybatisPlusApplicationTests {

    @Autowired
    private UserDao userDao;

    @Test
    void contextLoads() {
        List<User> users = userDao.selectList(null);
        System.out.println(users);
        // [User{id=1, username='zhangsan', password='123', name='张三'}, User{id=2, username='lisi', password='123', name='李四'}]
    }
}
  • 注意: 如果你的数据库表有前缀要在 application.yml 添加如下配制
yaml
复制代码
#设置Mp相关的配置 
mybatis-plus: 
    global-config: 
        db-config: 
            table-prefix: tbl_

28-SpringBoot整合Druid

  • Druid是阿里巴巴开源平台上一个数据库连接池实现,结合C3P0、DBCP、PROXOOL等DB池的优点,同时加入了日志监控。可以很好的监控DB池连接和SQL的执行情况,是针对监控而生的DB连接池,内置强大的监控功能,监控特性不影响性能。功能强大,能防SQL注入,内置Loging能诊断Hack应用行为。
  • 导入Druid对应的starter
xml
复制代码
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.6</version>
</dependency>
  • 指定数据源类型 (这种方式只需导入一个 Druid 的坐标)
yaml
复制代码
#DB Configuration:
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/springboot_db?serverTimezone=UTC
    username: root
    password: 123456
    type: com.alibaba.druid.pool.DruidDataSource
  • 或者 变更Druid的配置方式(推荐) 这种方式需要导入 Druid对应的starter
yaml
复制代码
spring:
  datasource:
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver
      url: jdbc:mysql://localhost:3306/springboot_db?serverTimezone=UTC
      username: root
      password: 123456