spring boot基础知识

  • 一、spring boot简介
  • 1.1 原有Spring优缺点分析
  • 1.1.1 Spring的优点分析
  • 1.1.2 Spring的缺点分析
  • 1.2 SpringBoot的概述
  • 1.2.1 SpringBoot解决上述Spring的缺点
  • 1.2.2 SpringBoot的特点
  • 1.2.3 SpringBoot的核心功能
  • 二、SpringBoot快速入门
  • 2.1 代码实现
  • 2.1.1 创建Maven工程
  • 2.1.2 添加SpringBoot的起步依赖
  • 2.1.3 编写SpringBoot引导类
  • 2.1.5 测试
  • 2.2 快速入门解析
  • 2.2.2 SpringBoot代码解析
  • 2.2.3 SpringBoot工程热部署
  • 2.2.4 使用idea快速创建SpringBoot项目
  • 三、SpringBoot原理分析
  • 3.1 起步依赖原理分析
  • 3.1.1 分析spring-boot-starter-parent
  • 3.1.2 分析spring-boot-starter-web
  • 3.2 自动配置原理解析
  • 四、SpringBoot的配置文件
  • 4.1 SpringBoot配置文件类型
  • 4.1.1 SpringBoot配置文件类型和作用
  • 4.1.2 application.yml配置文件
  • 4.1.2.1 yml配置文件简介
  • 4.1.2.2 yml配置文件的语法
  • 4.1.2.2.1 配置普通数据
  • 4.1.2.2.2 配置对象数据
  • 4.1.2.2.2 配置Map数据
  • 4.1.2.2.3 配置数组(List、Set)数据
  • 4.1.3 SpringBoot配置信息的查询
  • 4.2 配置文件与配置类的属性映射方式
  • 4.2.1 使用注解@Value映射
  • 4.2.2 使用注解@ConfigurationProperties映射
  • 五、SpringBoot与整合其他技术
  • 5.1 SpringBoot整合Mybatis
  • 5.1.1 添加Mybatis的起步依赖
  • 5.1.2 添加数据库驱动坐标
  • 5.1.3 添加数据库连接信息
  • 5.1.4 创建user表
  • 5.1.5 创建实体Bean
  • 5.1.6 编写Mapper
  • 5.1.7 配置Mapper映射文件
  • 5.1.8 在application.properties中添加mybatis的信息
  • 5.1.9 编写测试Controller
  • 5.1.10 测试
  • 5.2 SpringBoot整合Junit
  • 5.2.1 添加Junit的起步依赖
  • 5.2.2 编写测试类
  • 5.2.3 控制台打印信息
  • 5.3 SpringBoot整合Spring Data JPA
  • 5.3.1 添加Spring Data JPA的起步依赖
  • 5.3.2 添加数据库驱动依赖
  • 5.3.3 在application.properties中配置数据库和jpa的相关属性
  • 5.3.4 创建实体配置实体
  • 5.3.5 编写UserRepository
  • 5.3.6 编写测试类
  • 5.3.7 控制台打印信息
  • 5.4 SpringBoot整合Redis
  • 5.4.1 添加redis的起步依赖
  • 5.4.2 配置redis的连接信息
  • 5.4.3 注入RedisTemplate测试redis操作


一、spring boot简介

1.1 原有Spring优缺点分析

1.1.1 Spring的优点分析

Spring是Java企业版(Java Enterprise Edition,JEE,也称J2EE)的轻量级代替品。无需开发重量级的Enterprise JavaBean(EJB),Spring为企业级Java开发提供了一种相对简单的方法,通过依赖注入和面向切面编程,用简单
的Java对象(Plain Old Java Object,POJO)实现了EJB的功能。

1.1.2 Spring的缺点分析

虽然Spring的组件代码是轻量级的,但它的配置却是重量级的。一开始,Spring用XML配置,而且是很多XML配
置。Spring 2.5引入了基于注解的组件扫描,这消除了大量针对应用程序自身组件的显式XML配置。Spring 3.0引入
了基于Java的配置,这是一种类型安全的可重构配置方式,可以代替XML。
所有这些配置都代表了开发时的损耗。因为在思考Spring特性配置和解决业务问题之间需要进行思维切换,所以编
写配置挤占了编写应用程序逻辑的时间。和所有框架一样,Spring实用,但与此同时它要求的回报也不少。
除此之外,项目的依赖管理也是一件耗时耗力的事情。在环境搭建时,需要分析要导入哪些库的坐标,而且还需要
分析导入与之有依赖关系的其他库的坐标,一旦选错了依赖的版本,随之而来的不兼容问题就会严重阻碍项目的开
发进度。

1.2 SpringBoot的概述

1.2.1 SpringBoot解决上述Spring的缺点

SpringBoot对上述Spring的缺点进行的改善和优化,基于约定优于配置的思想,可以让开发人员不必在配置与逻辑
业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中,从而大大提高了开发的效率,一定程度上缩短
了项目周期。

1.2.2 SpringBoot的特点

1.为基于Spring的开发提供更快的入门体验
2.开箱即用,没有代码生成,也无需XML配置。同时也可以修改默认值来满足特定的需求
3.提供了一些大型项目中常见的非功能性特性,如嵌入式服务器、安全、指标,健康检测、外部配置等
3.SpringBoot不是对Spring功能上的增强,而是提供了一种快速使用Spring的方式

1.2.3 SpringBoot的核心功能

起步依赖
起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依
赖,这些东西加在一起即支持某项功能。
简单的说,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能。
自动配置
Spring Boot的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程,考虑了众多因素,才决定
Spring配置应该用哪个,不该用哪个。该过程是Spring自动完成的。

二、SpringBoot快速入门

2.1 代码实现

2.1.1 创建Maven工程

使用idea工具创建一个maven工程,该工程为普通的java工程即可

基于spring boot的学科竞赛管理系统 spring boot培训_spring


基于spring boot的学科竞赛管理系统 spring boot培训_spring_02

2.1.2 添加SpringBoot的起步依赖

SpringBoot要求,项目要继承SpringBoot的起步依赖spring-boot-starter-parent

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
    </parent>

SpringBoot要集成SpringMVC进行Controller的开发,所以项目要导入web的启动依赖

<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>

2.1.3 编写SpringBoot引导类

要通过SpringBoot提供的引导类起步SpringBoot才可以进行访问

package com.etouch.quik;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @author fei
 */
@SpringBootApplication
public class MySpringBootApplication {
    public static void main(String[] args) {
        SpringApplication.run(MySpringBootApplication.class, args);
    }
}

2.1.4 编写Controller
在引导类MySpringBootApplication同级包或者子级包中创建QuickStartController

package com.etouch.com.etouch.controller;

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


@RestController
public class QuickController {

    @GetMapping("/test")
    public String test(String test) {
        return test + "访问成功";
    }
}

2.1.5 测试

执行SpringBoot起步类的主方法,控制台打印日志如下:

启动项目, 访问成功

基于spring boot的学科竞赛管理系统 spring boot培训_xml_03


通过日志发现,Tomcat started on port(s): 8080 (http) with context path ‘’ tomcat已经起步,端口监听8080,web应用的虚拟工程名称为空

打开浏览器访问url地址为:http://localhost:8080/test?test=1

基于spring boot的学科竞赛管理系统 spring boot培训_xml_04

2.2 快速入门解析

2.2.2 SpringBoot代码解析

  1. @SpringBootApplication:标注SpringBoot的启动类,该注解具备多种功能(后面详细剖析)
  2. SpringApplication.run(MySpringBootApplication.class) 代表运行SpringBoot的启动类,参数为SpringBoot启动类的字节码对象

2.2.3 SpringBoot工程热部署

我们在开发中反复修改类、页面等资源,每次修改后都是需要重新启动才生效,这样每次启动都很麻烦,浪费了大
量的时间,我们可以在修改代码后不重启就能生效,在 pom.xml 中添加如下配置就可以实现这样的功能,我们称
之为热部署。
导入以下jar包

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

注意:IDEA进行SpringBoot热部署失败原因

出现这种情况,并不是热部署配置问题,其根本原因是因为Intellij IEDA默认情况下不会自动编译,需要对IDEA进

行自动编译的设置,如下:

基于spring boot的学科竞赛管理系统 spring boot培训_java_05


然后 Shift+Ctrl+Alt+/,选择Registry

基于spring boot的学科竞赛管理系统 spring boot培训_spring_06

2.2.4 使用idea快速创建SpringBoot项目

基于spring boot的学科竞赛管理系统 spring boot培训_xml_07


基于spring boot的学科竞赛管理系统 spring boot培训_spring boot_08


基于spring boot的学科竞赛管理系统 spring boot培训_java_09


基于spring boot的学科竞赛管理系统 spring boot培训_java_10


通过idea快速创建的SpringBoot项目的pom.xml中已经导入了我们选择的web的起步依赖的坐标

<?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>
    <groupId>com.etouch</groupId>
    <artifactId>springboot-quick2</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-quick2</name>
    <description>Demo project for Spring Boot</description>

<!--    <parent>-->
<!--        <groupId>org.springframework.boot</groupId>-->
<!--        <artifactId>spring-boot-starter-parent</artifactId>-->
<!--        <version>2.3.2.RELEASE</version>-->
<!--        <relativePath/> <!– lookup parent from repository –>-->
<!--    </parent>-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
    </parent>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

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

</project>

可以使用快速入门的方式创建Controller进行访问,此处不再赘述

三、SpringBoot原理分析

3.1 起步依赖原理分析

3.1.1 分析spring-boot-starter-parent

按住Ctrl点击pom.xml中的spring-boot-starter-parent,跳转到了spring-boot-starter-parent的pom.xml,xml配
置如下(只摘抄了部分重点配置):

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.1.6.RELEASE</version>
    <relativePath>../../spring-boot-dependencies</relativePath>
  </parent>

按住Ctrl点击pom.xml中的spring-boot-starter-dependencies,跳转到了spring-boot-starter-dependencies的 pom.xml,xml配置如下(只摘抄了部分重点配置):

<properties>
    <activemq.version>5.15.9</activemq.version>
    <antlr2.version>2.7.7</antlr2.version>
    <appengine-sdk.version>1.9.75</appengine-sdk.version>
    <artemis.version>2.6.4</artemis.version>
    <aspectj.version>1.9.4</aspectj.version>
    <assertj.version>3.11.1</assertj.version>
    <atomikos.version>4.0.6</atomikos.version>
    <bitronix.version>2.1.4</bitronix.version>
<dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot</artifactId>
        <version>2.1.6.RELEASE</version>
      </dependency>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-test</artifactId>
        <version>2.1.6.RELEASE</version>
      </dependency>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-test-autoconfigure</artifactId>
        <version>2.1.6.RELEASE</version>
      </dependency>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-actuator</artifactId>
        <version>2.1.6.RELEASE</version>
      </dependency>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-actuator-autoconfigure</artifactId>
        <version>2.1.6.RELEASE</version>
      </dependency>

3.1.2 分析spring-boot-starter-web

按住Ctrl点击pom.xml中的spring-boot-starter-web,跳转到了spring-boot-starter-web的pom.xml,xml配置如
下(只摘抄了部分重点配置):

<dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
      <version>2.1.6.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-json</artifactId>
      <version>2.1.6.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-tomcat</artifactId>
      <version>2.1.6.RELEASE</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>org.hibernate.validator</groupId>
      <artifactId>hibernate-validator</artifactId>
      <version>6.0.17.Final</version>
      <scope>compile</scope>
    </dependency>

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

3.2 自动配置原理解析

按住Ctrl点击查看启动类MySpringBootApplication上的注解@SpringBootApplication

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package org.springframework.boot.autoconfigure;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.boot.context.TypeExcludeFilter;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.FilterType;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.core.annotation.AliasFor;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {@Filter(
    type = FilterType.CUSTOM,
    classes = {TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
    @AliasFor(
        annotation = EnableAutoConfiguration.class
    )
    Class<?>[] exclude() default {};

    @AliasFor(
        annotation = EnableAutoConfiguration.class
    )
    String[] excludeName() default {};
    ..................................

其中,
@SpringBootConfiguration:等同与@Configuration,既标注该类是Spring的一个配置类
@EnableAutoConfiguration:SpringBoot自动配置功能开启

按住Ctrl点击查看注解@EnableAutoConfiguration

package org.springframework.boot.autoconfigure;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.context.annotation.Import;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

    Class<?>[] exclude() default {};

    String[] excludeName() default {};
}

其中,@Import(AutoConfigurationImportSelector.class) 导入了AutoConfigurationImportSelector类, 按住Ctrl点击查看AutoConfigurationImportSelector源码

基于spring boot的学科竞赛管理系统 spring boot培训_xml_11


其中,SpringFactoriesLoader.loadFactoryNames 方法的作用就是从META-INF/spring.factories文件中读取指定

类对应的类名称列表

基于spring boot的学科竞赛管理系统 spring boot培训_spring boot_12

spring.factories 文件中有关自动配置的配置信息如下:

基于spring boot的学科竞赛管理系统 spring boot培训_java_13


上面配置文件存在大量的以Configuration为结尾的类名称,这些类就是存有自动配置信息的类,而

SpringApplication在获取这些类名后再加载

我们以ServletWebServerFactoryAutoConfiguration为例来分析源码:

基于spring boot的学科竞赛管理系统 spring boot培训_java_14


基于spring boot的学科竞赛管理系统 spring boot培训_java_15


其中,

@EnableConfigurationProperties(ServerProperties.class) 代表加载ServerProperties服务器配置属性类

基于spring boot的学科竞赛管理系统 spring boot培训_spring_16

基于spring boot的学科竞赛管理系统 spring boot培训_java_17

基于spring boot的学科竞赛管理系统 spring boot培训_mybatis_18


基于spring boot的学科竞赛管理系统 spring boot培训_xml_19


基于spring boot的学科竞赛管理系统 spring boot培训_xml_20


基于spring boot的学科竞赛管理系统 spring boot培训_spring boot_21

四、SpringBoot的配置文件

4.1 SpringBoot配置文件类型

4.1.1 SpringBoot配置文件类型和作用

SpringBoot是基于约定的,所以很多配置都有默认值,但如果想使用自己的配置替换默认配置的话,就可以使用
application.properties或者application.yml(application.yaml)进行配置。
SpringBoot默认会从Resources目录下加载application.properties或application.yml(application.yaml)文件
其中,application.properties文件是键值对类型的文件,之前一直在使用,所以此处不在对properties文件的格式
进行阐述。除了properties文件外,SpringBoot还可以使用yml文件进行配置,下面对yml文件进行讲解。

4.1.2 application.yml配置文件

4.1.2.1 yml配置文件简介

YML文件格式是YAML (YAML Aint Markup Language)编写的文件格式,YAML是一种直观的能够被电脑识别的的数
据数据序列化格式,并且容易被人类阅读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导
入,比如: C/C++, Ruby, Python, Java, Perl, C#, PHP等。YML文件是以数据为核心的,比传统的xml方式更加简
洁。
YML文件的扩展名可以使用.yml或者.yaml。

4.1.2.2 yml配置文件的语法
4.1.2.2.1 配置普通数据

语法: key: value
示例代码:
name: haohao
注意:value之前有一个空格

4.1.2.2.2 配置对象数据

语法:

key: key1: value1 key2: value2

或者:

key: {key1: value1,key2: value2}

示例代码:

基于spring boot的学科竞赛管理系统 spring boot培训_xml_22


注意:key1前面的空格个数不限定,在yml语法中,相同缩进代表同一个级别

4.1.2.2.2 配置Map数据

同上面的对象写法

4.1.2.2.3 配置数组(List、Set)数据

基于spring boot的学科竞赛管理系统 spring boot培训_spring boot_23


示例代码:

基于spring boot的学科竞赛管理系统 spring boot培训_spring boot_24

#端口号
server:
  port: 8080

#普通的配置
name: 张三

#对象的配置
#person:
#  name: 张三
#  age: 18
#  city: 北京

#行内对象配置
person: {name: 张三,age: 18, city: 北京}

#配置数据,集合 方式1
#city:
#  - beijing
#  - shanghai
#  - shenzhen

#配置数据,集合 方式2
city: {beijing,shanghai,shenzhen}

#配置集合,对象数据 方式1
student:
  - name: tom
    age: 18
    addr: beijing
  - name: lucy
    age: 18
    addr: shanghai
#配置集合,对象数据 方式二

students: [{name: tom,age: 18,addr: beijing},{name: lucy,age: 18,addr: shanghai}]

#map的配置
map:
  key1: value1
  key2: value2

基于spring boot的学科竞赛管理系统 spring boot培训_spring boot_25


思考一个问题, 当yml文件和properties文件都存在, 并且相同的配置, 写入了不同的value值, 那么spring boot的配置文件执行顺序是什么呢, 我们不妨试一下yml的配置

基于spring boot的学科竞赛管理系统 spring boot培训_xml_26


properties的配置

基于spring boot的学科竞赛管理系统 spring boot培训_spring boot_27


这里将yml和properties同时都配置上端口号, 一个8080, 一个8081, 启动项目, 发现项目的端口号为8081

基于spring boot的学科竞赛管理系统 spring boot培训_spring_28

找到pom文件

基于spring boot的学科竞赛管理系统 spring boot培训_xml_29


点击进入,

基于spring boot的学科竞赛管理系统 spring boot培训_xml_30


发现是先加载yml文件, 后加载properties文件, 所以后加载的properties文件, 会将yml的相同配置覆盖掉

注意:value1与之间的 - 之间存在一个空格

4.1.3 SpringBoot配置信息的查询

上面提及过,SpringBoot的配置文件,主要的目的就是对配置信息进行修改的,但在配置时的key从哪里去查询
呢?我们可以查阅SpringBoot的官方文档
文档URL:https://docs.spring.io/spring-boot/docs/2.0.1.RELEASE/reference/htmlsingle/#common-application- properties

4.2 配置文件与配置类的属性映射方式

4.2.1 使用注解@Value映射

我们可以通过@Value注解将配置文件中的值映射到一个Spring管理的Bean的字段上

例如:

application.properties配置如下:

基于spring boot的学科竞赛管理系统 spring boot培训_spring boot_31


实体Bean代码如下:

基于spring boot的学科竞赛管理系统 spring boot培训_mybatis_32


浏览器访问地址:http://localhost:8080/quick 结果如下:

基于spring boot的学科竞赛管理系统 spring boot培训_xml_33

4.2.2 使用注解@ConfigurationProperties映射

通过注解@ConfigurationProperties(prefix=“配置文件中的key的前缀”)可以将配置文件中的配置自动与实体进行映射

package com.etouch.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;


/**
 * @author fei
 */
@RestController
@ConfigurationProperties(prefix = "person")
public class QuickController2 {

    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

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

    @GetMapping("/quick2")
    public String quick() {
        return "spring boot访问成功! name= "+name+",age= "+age;
    }

}

基于spring boot的学科竞赛管理系统 spring boot培训_xml_34


小技巧:

加入下面这个jar包

<!--@Configration的配置执行器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>

如果在下面中配置了前缀和name, 则在yml文件中写值时会有相应的提示

基于spring boot的学科竞赛管理系统 spring boot培训_mybatis_35

在yml文件中会有相应的提示

基于spring boot的学科竞赛管理系统 spring boot培训_mybatis_36

五、SpringBoot与整合其他技术

5.1 SpringBoot整合Mybatis

5.1.1 添加Mybatis的起步依赖

<!--mybatis起步依赖-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.1.1</version>
        </dependency>

5.1.2 添加数据库驱动坐标

<!-- MySQL连接驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.49</version>
        </dependency>

5.1.3 添加数据库连接信息

在application.properties中添加数据量的连接信息

#DB Configuration:
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test? useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root

5.1.4 创建user表

在test数据库中创建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', '李四');

5.1.5 创建实体Bean

public class User {

    private Integer id;

    private String username;

    private String password;
    //此处省略get,set方法
    }

5.1.6 编写Mapper

package com.etouch.mapper;

import com.etouch.entity.User;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper
public interface UserMapper {
    List<User> queryUserList();
}

注意:@Mapper标记该类是一个mybatis的mapper接口,可以被spring boot自动扫描到spring上下文中

5.1.7 配置Mapper映射文件

在src\main\resources\mapper路径下加入UserMapper.xml配置文件"

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.etouch.mapper.UserMapper">

    <select id="queryUserList" resultType="com.etouch.entity.User">
        select * from user;
    </select>
</mapper>

5.1.8 在application.properties中添加mybatis的信息

#spring集成Mybatis环境
# pojo别名扫描包
mybatis.type-aliases-package=com.etouch.entity 
# 加载Mybatis映射文件
mybatis.mapper-locations=classpath:mapper/*Mapper.xml

5.1.9 编写测试Controller

package com.etouch.controller;

import com.etouch.entity.User;
import com.etouch.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class UserController {
    @Autowired
    private UserMapper userMapper;

    @RequestMapping("/queryUser")
    public List<User> queryUser() {
        List<User> users = userMapper.queryUserList();
        return users;
    }
}

5.1.10 测试

基于spring boot的学科竞赛管理系统 spring boot培训_mybatis_37

5.2 SpringBoot整合Junit

5.2.1 添加Junit的起步依赖

<!--测试的起步依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

5.2.2 编写测试类

package com.etouch;

import com.etouch.entity.User;
import com.etouch.mapper.UserMapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringbootMybatisApplicationTests.class)
public class MapperTest {
    @Autowired
    private UserMapper userMapper;

    @Test
    public void test() {
        List<User> users = userMapper.queryUserList();
        System.out.println(users);
    }
}

其中,
SpringRunner继承自SpringJUnit4ClassRunner,使用哪一个Spring提供的测试测试引擎都可以

public final class SpringRunner extends SpringJUnit4ClassRunner

@SpringBootTest的属性指定的是引导类的字节码对象

5.2.3 控制台打印信息

基于spring boot的学科竞赛管理系统 spring boot培训_java_38

5.3 SpringBoot整合Spring Data JPA

5.3.1 添加Spring Data JPA的起步依赖

<!-- springBoot JPA的起步依赖 -->
        <!-- MySQL连接驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.49</version>
        </dependency>

5.3.2 添加数据库驱动依赖

<!-- springBoot JPA的起步依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

5.3.3 在application.properties中配置数据库和jpa的相关属性

#DB Configuration:
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?
useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root
#JPA Configuration:
spring.jpa.database=MySQL
spring.jpa.show-sql=true
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.ImprovedNamingStrategy

5.3.4 创建实体配置实体

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    private String username;

    private String password;
	//get,set,tostring 方法已省略

5.3.5 编写UserRepository

package com.etouch.repository;

import com.etouch.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;
public interface UserRepository extends JpaRepository<User,Integer> {

    @Override
    public List<User> findAll();
}

5.3.6 编写测试类

package com.etouch;

import com.etouch.entity.User;
import com.etouch.repository.UserRepository;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringbootJpaApplication.class)
public class JpaTest {

    @Autowired
    private UserRepository userRepository;

    @Test
    public void findAllUser() {
        List<User> all = userRepository.findAll();
        System.out.println(all);
    }
}

5.3.7 控制台打印信息

基于spring boot的学科竞赛管理系统 spring boot培训_xml_39


注意:如果是jdk9,执行报错如下

基于spring boot的学科竞赛管理系统 spring boot培训_java_40


原因:jdk缺少相应的jar

解决方案:手动导入对应的maven坐标,如下

<!--jdk9需要导入如下坐标-->
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>

5.4 SpringBoot整合Redis

5.4.1 添加redis的起步依赖

<!-- 配置使用redis启动器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency

5.4.2 配置redis的连接信息

#Redis
spring.redis.host=127.0.0.1
spring.redis.port=6379

5.4.3 注入RedisTemplate测试redis操作

import com.etouch.entity.User;
import com.etouch.repository.UserRepository;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringbootJpaApplication.class)
public class RedisTest {
    @Autowired
    private UserRepository userRepository;

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    @Test
    public void test() throws JsonProcessingException {
            //1.从redis中获得数据,数据的形式为json字符串
        String userListData = redisTemplate.boundValueOps("user.findAll").get();
            //2.判断redis中是否存在数据
        if (null == userListData) {
            //3.不存在数据,从数据库中获取,查询数据库获得数据
            List<User> all = userRepository.findAll();
            //转换成json格式字符串
            ObjectMapper om = new ObjectMapper();
            userListData = om.writeValueAsString(all);
            //将数据存储到redis中,下次在查询直接从redis中获得数据,不用在查询数据库
            redisTemplate.boundValueOps("user.findAll").set(userListData);
            System.out.println("===============从数据库获得数据===============");
        } else {
            System.out.println("===============从redis缓存中获得数据===============");
        }
        System.out.println(userListData);
    }

}

第一次执行, 由于还未存入redis中, 所以是从数据库中获取数据

基于spring boot的学科竞赛管理系统 spring boot培训_java_41


第二次执行, 由于第一次啊查询时, redis中已经缓存了相应数据, 所以这次是从redis中获取

基于spring boot的学科竞赛管理系统 spring boot培训_xml_42

未完待续: 2020.07.27