SpringBoot


SpringBoot

学习目标

  • 掌握基于SpringBoot框架的程序开发步骤。
  • 熟练使用SpringBoot配置信息修改服务器配置。
  • 基于SpringBoot的完成SSM整合项目开发。

一、SpringBoot简介

1.1 入门案例

(1)新建springboot项目 —— Spring Initializr

(2)选中 Web ,然后勾选 Spring Web

(3)可以删的文件

(4)创建 Controller

  • 在 com.li.controller 包下创建 BookController ,代码如下:
@RequestMapping("/books")
@RestController
public class BookController {

    //http://localhost:8080/books/1
    @GetMapping("/{id}")
    public String getById(@PathVariable Integer id){
        System.out.println("id =>"+id);
        return "hello springboot";
    }
}

(5)启动服务器

(6)测试

1.2 SpringBoot概述

(1)Spring程序缺点

  • 配置繁琐
  • 依赖设置繁琐

(2)SpringBoot程序优点

  • 自动配置
  • 起步依赖(简化依赖配置)
  • 辅助功能(内置服务器,.......)

(3)SpringBoot起步依赖

<?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>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.3</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.li</groupId>
    <artifactId>springboot-demo1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-demo1</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <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>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

starter

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

parent

  • 所有SpringBoot项目要继承的项目,定义了若干个坐标版本号(依赖管理,而非依赖),以达到减少依赖冲突的目的。
  • spring-boot-starter-parent(2.5.0) 与spring-boot-starter-parent(2.4.6) 共计57处坐标版本不同。

实际开发

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

二、基础配置

2.1 配置文件格式

(1)SpringBoot提供了多种属性配置方式

  • application.properties
server.port=80
  • application.yml
  • 主要用这个yml的
server:
  port: 81
  • application.yaml
server:
  port: 82

(2)SpringBoot配置文件加载顺序(了解)

application.properties > application.yml > application.yam1

2.2 yaml

  • YAML(YAML Ain 't Markup Language) ,一种数据序列化格式。
  • 优点:

    • 容易阅读
    • 容易与脚本语言交互
    • 以数据为核心,重数据轻格式
  • YAML文件扩展名

    • .yml(主流)
    • .yaml

(1)yaml语法规则

  • 大小写敏感
  • 属性层级关系使用多行描述,每行结尾使用冒号结束
  • 使用缩进表示层级关系,同层级左侧对齐,只允许使用空格(不允许使用Tab键)
  • 属性值前面添加空格(属性名与属性值之间使用冒号+空格作为分隔)
  • #表示注释
  • 核心规则:数据前面要加空格与冒号隔开
#yml
enterprise:
    #属性值前面添加空格
    name: li
    age: 16
    tel: 4006184000

(2)yam1数组数据

  • 数组数据在数据书写位置的下方使用减号作为数据开始符号,每行书写一个数据,减号与数据间空格分隔。
#yml
enterprise:
    #属性值前面添加空格
    name: li
    age: 16
    tel: 4006184000
    #yam1数组数据
    subject:
    - Java
    - php
    - 数据结构

2.3 yaml配置文件数据读取

(1)环境准备

  • 新建springboot项目
  • 在 com.li.controller 包写创建名为 BookController 的控制器,内容如下:
@RestController
@RequestMapping("/books")
public class BookController {
    @GetMapping("/{id}")
    public String getById(@PathVariable Integer id){
        System.out.println("id ==> "+id);
        return "hello , spring boot!";
    }
}
  • 在 com.li.domain 包下创建一个名为 Enterprise 的实体类等会用来封装数据,内容如下:
package com.li.domain;

import java.util.Arrays;

public class Enterprise {
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getTel() {
        return tel;
    }

    public void setTel(String tel) {
        this.tel = tel;
    }

    public String[] getSubject() {
        return subject;
    }

    public void setSubject(String[] subject) {
        this.subject = subject;
    }

    @Override
    public String toString() {
        return "Enterprise{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", tel='" + tel + '\'' +
                ", subject=" + Arrays.toString(subject) +
                '}';
    }

    private String name;
    private int age;
    private String tel;
    private String[] subject;
}
  • 在 resources 下创建一个名为 application.yml 的配置文件,里面配置了不同的数据,内容如下:
lesson: SpringBoot

server:
  port: 80

enterprise:
  name: itcast
  age: 16
  tel: 4006184000
  subject:
    - 大户数据
    - 安达市
    - 三大
    - 算法

(2)读取配置数据

① 使用 @Value注解(直接读取)

  • 使用 @Value("表达式") 注解可以从配合文件中读取数据,注解中用于读取属性名引用方式是: ${一级属性名.二级属性名……}
  • 可以在 BookController 中使用 @Value 注解读取配合文件数据,如下:
@RestController
@RequestMapping("/books")
public class BookController {

    @Value("${lesson}")
    private String lesson;
    @Value("${server.port}")
    private Integer port;
    @Value("${enterprise.subject[1]}")
    private String subject_00;

    @GetMapping("/{id}")
    public String getById (@PathVariable Integer id){
        System.out.println("id==>"+id);
        System.out.println(lesson);
        System.out.println(port);
        System.out.println(subject_00);
        return "hhhhhh";
    }

}

② Environment对象(封装后读取)

  • 上面方式读取到的数据特别零散, SpringBoot 还可以使用 @Autowired 注解注入 Environment 对象的方式读取数据。
  • 这种方式 SpringBoot 会将配置文件中所有的数据封装到 Environment 对象中,如果需要使用哪个数据只需要通过调用 Environment 对象的 getProperty(String name) 方法获取。
  • 这种方式,框架内容大量数据,而在开发中我们很少使用。
@RestController
@RequestMapping("/books")
public class BookController {

    @Autowired
    private Environment env;

    @GetMapping("/{id}")
    public String getById (@PathVariable Integer id){
        System.out.println("id==>"+id);
        System.out.println(env.getProperty("lesson"));
        System.out.println(env.getProperty("enterprise.name"));
        System.out.println(env.getProperty("enterprise.subject[0]"));
        return "hhhhhh";
    }

}

③ 自定义对象(封装后读取)

  • SpringBoot 还提供了将配置文件中的数据封装到我们自定义的实体类对象中的方式。‘
  • 具体操作如下:

    • 将实体类 bean 的创建交给 Spring 管理。
    • 在类上添加 @Component 注解。
    • 使用@ConfigurationProperties注解表示加载配置文件。
    • 在该注解中也可以使用 prefix 属性指定只加载指定前缀的数据。
    • BookController 中进行注入。
实例
  • Enterprise 实体类
  • 和一开始的有什么不同,看注释。
  • //@Component
  • //@ConfigurationProperties(prefix = "enterprise")
package com.li.domain;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

import java.util.Arrays;

//@Component
//@ConfigurationProperties(prefix = "enterprise")
@Component
@ConfigurationProperties(prefix = "enterprise")
public class Enterprise {
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getTel() {
        return tel;
    }

    public void setTel(String tel) {
        this.tel = tel;
    }

    public String[] getSubject() {
        return subject;
    }

    public void setSubject(String[] subject) {
        this.subject = subject;
    }

    @Override
    public String toString() {
        return "Enterprise{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", tel='" + tel + '\'' +
                ", subject=" + Arrays.toString(subject) +
                '}';
    }

    private String name;
    private int age;
    private String tel;
    private String[] subject;
}
  • BookController
@RestController
@RequestMapping("/books")
public class BookController {
    @Autowired
    private Enterprise enterprise;

    @GetMapping("/{id}")
    public String getById (@PathVariable Integer id){
        System.out.println("id==>"+id);
        System.out.println(enterprise.getName());
        System.out.println(enterprise.getAge());
        System.out.println(enterprise.getSubject());
        System.out.println(enterprise.getTel());
        System.out.println(enterprise.getSubject()[0]);

        return "hhhhhh";
    }

}
  • 使用第三种方式,在实体类上有如下警告提示:
  • 在 pom.xml 中添加如下依赖即可解决
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

2.4 多环境配置

  • 以后在工作中,对于开发环境、测试环境、生产环境的配置肯定都不相同,比如我们开发阶段会在自己的电脑上安装 mysql ,连接自己电脑上的 mysql 即可,但是项目开发完毕后要上线就需要该配置,将环境的配置改为线上环境的。
  • 来回的修改配置会很麻烦,而 SpringBoot 给开发者提供了多环境的快捷配置,需要切换环境时只需要改一个配置即可。
  • 不同类型的配置文件多环境开发的配置都不相同,接下来对不同类型的配置文件进行说明。

(1)yaml文件

  • application.yml 中使用 --- 来分割不同的配置,内容如下:
#开发
spring:
  profiles:
    active: pro

---
#开发
spring:
  profiles: dev
server:
  port: 90

---
#生产
spring:
  profiles: pro
server:
  port: 91

---
#测试
spring:
  profiles: test
server:
  port: 92
  • 注意:在上面配置中给不同配置起名字的 spring.profiles 配置项已经过时。

(2)最新的配置项

---
#测试
spring:
  config:
    activate:
      on-profile: test
server:
  port: 985

(3)properties文件

  • 也可以用properties文件来配置多环境需要定义不同的配置文件。
  • 但是很麻烦,了解即可。
  • 需要创建很多文件。

2.5 配置文件分类

  • SpringBoot 中4级配置文件放置位置:

    • 1级:classpath:application.yml
    • 2级:classpath:config/application.yml
    • 3级:file :application.yml
    • 4级:file :config/application.yml
  • 说明:级别越高优先级越高

作用

  • 1级与2级用于系统开发阶段设置通用属性。(classpath)
  • 3级与4级留做系统打包后设置通用属性。(file)

三、SpringBoot整合junit

3.1 环境准备

  • 新建springboot项目
  • com.li.service 下创建 BookService 接口,内容如下:
package com.li.service;

public interface BookService {
    public void save();
}
  • com.li.service.impl 包写创建一个 BookServiceImpl 类,使其实现 BookService 接口,内容如下:
@Service
public class BookServiceImpl implements BookService {

    @Override
    public void save(){
        System.out.println("book running");
    }
}

3.2 编写测试类

  • test/java 下将 BookService 注入到该测试类中。
  • @SpringBootTest
@SpringBootTest
class SpringbootJunitApplicationTests {

    @Autowired
    private BookService bookService;

    @Test
    public void save(){
        bookService.save();
    }

}

3.3 @SpringBootTest

四、SpringBoot整合mybatis

4.1 新建项目

  • 新建springboot项目
  • 选择当前模块需要使用的技术集(MySQL Driver、MyBatis Framework、Spring Web)

4.2 代码编写

(1)定义实体类

  • 在 com.li.domain 包下定义实体类 Book ,内容如下:
package com.li.domain;

public class Book {
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", type='" + type + '\'' +
                ", description='" + description + '\'' +
                '}';
    }

    private Integer id;
    private String name;
    private String type;
    private String description;
}

(2)定义dao接口

  • 在 com.li.dao 包下定义 BookDao 接口,内容如下:
  • 必须要加@Mapper
  • 不加@Mapper会报错 —— Spring 容器中没有 BookDao 类型的 bean。
  • Mybatis 会扫描接口并创建接口的代码对象交给 Spring 管理,但是现在并没有告诉 Mybatis 哪个是 dao 接口。
  • 而我们要解决这个问题需要在 BookDao 接口上使用 @Mapper
@Mapper
public interface BookDao {
    @Select("select * from tbl_book where id =#{id}")
    public Book getById(Integer id);
}

(3)定义测试类

@SpringBootTest
class SpringbootMybatisApplicationTests {

    @Autowired
    private BookDao bookDao;

    @Test
    void testGetById() {
        Book book = bookDao.getById(1);
        System.out.println(book);
    }

}

(4)编写配置(application.yml)

  • application.yml 配置文件中配置如下内容
  • serverTimezone=UTC必须要加。
  • SpringBoot 版本低于2.4.3(不含),Mysql驱动版本大于8.0时,需要在url连接串中配置时区 jdbc:mysql://localhost:3307/ssm_db?serverTimezone=UTC ,或在MySQL数据库端配置时区解决此问题。
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3307/ssm_db?serverTimezone=UTC
    username: root
    password: 1234

(5)使用Druid数据源(可选项)

  • SpringBoot 有默认的数据源,我们也可以指定使用 Druid 数据源。
  • 导入 Druid 依赖
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.16</version>
</dependency>
  • 在 application.yml 配置文件配置
  • 多了一段type: com.alibaba.druid.pool.DruidDataSource
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3307/ssm_db?serverTimezone=UTC
    username: root
    password: 1234
    type: com.alibaba.druid.pool.DruidDataSource

五、案例:基于SpringBoot的SSM整合案例

5.1 新建springboot项目

  • 新建springboot项目
  • 选择当前模块需要使用的技术集(MySQL Driver、MyBatis Framework、Spring Web)

5.2 导入Druid坐标

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.16</version>
</dependency>

5.3 代码拷贝

  • 将原来的SSM整合代码拷贝进该项目中。
  • 需要修改的内容如下:

    • config 包下的配置类,SpringBoot工程不需要这些配置类,直接删除。
    • dao 包下的接口添加 @Mapper 注解。
@Mapper
public interface BookDao {
    
    @Insert("insert into tbl_book (type,name,description) values(#{type}," +
            "#{name},#{description})")
    public int  save(Book book);

    @Update("update tbl_book set type=#{type},name=#{name},description=#{description} " +
            "where id = #{id}")
    public int  update(Book book);

    @Delete("delete from tbl_book where id = #{id}")
    public int delete(Integer id);

    @Select("select * from tbl_book where id = #{id}")
    public Book getById(Integer id);

    @Select("select * from tbl_book")
    public List<Book> getAll();

}

5.4 application.yml 配置文件

  • 服务的端口号
  • 连接数据库的信息
  • 数据源
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3307/ssm_db?serverTimezone=UTC
    username: root
    password: 1234
    type: com.alibaba.druid.pool.DruidDataSource

server:
  port: 80

5.5 静态资源

  • 静态资源需要放在 resources 下的 static 下。

5.6 配置访问localhost直接默认访问首页

  • resources 下的 static 下新建index.html
<script>
  document.location.href="pages/books.html"
</script>

5.7 访问localhost

5.8 总结(SSM项目修改为springboot项目)

  • pom.xml

    • 配置起步依赖,必要的资源坐标(druid)
  • application.yml

    • 设置数据源、端口等
  • 配置类

    • 全部删除
  • dao

    • 设置@Mapper
  • 测试类
  • 页面

    • 放置在resources目录下的static目录中

声明:三二一的一的二|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - SpringBoot


三二一的一的二