SpringBoot Ⅰ

Posted 364.99°

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot Ⅰ相关的知识,希望对你有一定的参考价值。

1.概述

SpringBoot: Spring顶级项目之一,提供了一种快速使用 Spring 的方式,提高开发效率,14年发布。

  • 自动配置
    程序启动时,SpringBoot自动完成Spring的配置
  • 起步依赖
    将具备某种功能的坐标打包到一起,并提供一些默认的功能(Maven依赖传递)
  • 辅助功能
    提供了一些大型项目中常见的非功能性特性

案例: 搭建SpringBoot工程,定义HelloController.hello()方法,返回”hello SpringBoot!”。


Ⅰ 创建Maven项目

   FilenewModuleMaven□Create from archetype

   FilenewModuleMavenSpring Initializr

Ⅱ 导入SpringBoot起步依赖

   Spring Boot Reference Guidehttps://docs.spring.io/spring-boot/docs/1.0.2.RELEASE/reference/html/index.html
   Getting startedInstalling Spring BootInstalling instruction for the Java developerMaven installation

    <!--springboot 需要继承的父工程-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.8.RELEASE</version>
    </parent>

    <dependencies>
        <!--web开发的起步依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

Ⅲ 定义Controller类

package demo.controller;

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

@RestController
public class HelloController 
    @RequestMapping("/hello")
    public String hello()
        return "hello SpringBoot !";
    


Ⅳ 编写引导类

package demo;

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

/*
* 引导类:Spring Boot的入口
* */
@SpringBootApplication
public class HelloApplication 
    public static void main(String[] args) 
        SpringApplication.run(HelloApplication.class,args);
    


Ⅴ 启动测试

注意: Application.java 放在最外侧,即包含所有子包,不然网页会报错 Whitelabel Error Page

小结:

  • SpringBoot在创建项目时,使用jar的打包方式
  • SpringBoot的引导类,是项目入口,运行main方法就可以启动项目
  • 使用SpringBoot和Spring构建的项目,业务代码编写方式完全一样

起步依赖:

  • spring-boot-starter-parent中定义了各种技术的版本信息,组合了一套最优搭配的技术版本
  • 在各种starter中,定义了完成该功能需要的坐标合集,其中大部分版本信息来自于父工程
  • 我们的工程继承parent,引入starter后,通过依赖传递,就可以简单方便获得需要的jar包,并且不会存在版本冲突等问题

2.配置

2.1 分类

SpringBoot是基于约定的,所以很多配置都有默认值,但如果想使用自己的配置替换默认配置的话,就可以使用application.properties或者application.yml(application.yaml)进行配置。

SpringBoot很多配置都有默认值,需要修改这些值可以配置application.propertiesapplication.yml(application.yaml)

properties:

key.proname = value;

yml(yaml):

key:
	proname:value

注意:

  • 配置文件只能叫application,后缀名可以不同(properties、yml、yaml都可以)
  • 三个配置文件优先级:.properties > .yml > .yaml

2.2 yaml

yaml:

  • 一种直观的能够被电脑识别的的数据数据序列化格式
  • 易读,利于和脚本语言交互,可以被支持YAML库的不同的编程语言程序导入
  • 以数据为核心的,比传统的xml方式更加简洁
  • 扩展名:.yml、.yaml

基本语法:

  • 大小写敏感,#为注释符
  • 使用缩进表示层级关系
  • 数据值前边必须有空格,作为分隔符
    建议别用tab缩进,有些编译器会产生层次混乱(各个系统tab对应的空格数目不同),当然IDEA没问题
  • 缩进的空格数目不要求,只要相同层级的元素左侧对齐即可

数据格式:

□ 对象(map):键值对的集合

# 缩进写法
person:
	name: zhangsan
# 行内写法
person: name: zhangsan

□ 数组:一组按次序排列的值

# 缩进写法
address:
	- beijing
	- shanghai
# 行内写法
address: [beijing,shanghai]

□ 纯量:单个的、不可再分的值

msg1: 'hello \\n world' # 单引号忽略转义字符
msg2: "hello \\n world" # 双引号识别转义字符

参数引用
$

name: zhangsan

person:
	name: $name # 引用上边定义的name值

2.3 读取配置文件

@ValueEnvironment@ConfigurationProperties

application.yml

server:
  port: 8089

name: zhangsan

person:
  name: $name # 引用上边定义的name值
  age: 30

jobs:
  - peasant-worker
  - white-collar

msg1: 'hello \\n world' # 单引号忽略转义字符
msg2: "hello \\n world" # 双引号识别转义字符

@Value() 读取数据

@RestController
public class HelloController 

    @Value("$person.name")
    private String name;

    @Value("$person.age")
    private int age;

    @Value("$msg2")
    private String msg2;

    @RequestMapping("/hello")
    public String Hello()
        
        System.out.println(name + " " + age + " " + msg2);
        return name + " " + age + " " + msg2;
    

运行引导类:


Environment 读取数据

@RestController
public class HelloController 

    @Autowired
    private Environment env;

    @RequestMapping("/hello")
    public String Hello()
        System.out.println(env.getProperty("jobs[0]"));
        return env.getProperty("jobs[0]");
    

运行引导类:


@ConfigurationProperties 读取数据

新建Person类读取数据

@Component  //Person类被Spring识别
@ConfigurationProperties(prefix = "person") //prefix = 前缀
public class Person 
    private String name;
    private int age;

    public String getName() 
        return name;
    

    public int getAge() 
        return age;
    
    

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

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

    @Override
    public String toString() 
        return "Person" +
                "name='" + name + '\\'' +
                ", age=" + age +
                '';
    

读Person类的数据

@RestController
public class HelloController 

    @Autowired
    private Person person;

    @RequestMapping("/hello")
    public Person Hello()
        System.out.println(person);
        return person;
    

运行引导类:

Person类顶部会出现一个红条:

消除:
点击Open Documentation → 复制依赖坐标<dependency>并粘贴在pom.xml


作用:重启项目之后,.yml就会有提示信息(自动补全)

2.4 profile

profile: 实现动态配置切换的功能
开发SpringBoot应用,通常会将一套程序安装到不同的环境(开发、测试、生产…),其中数据库、服务器等配置都不同,每次打包都需要修改配置文件,会很麻烦。而profile就很好解决了这个麻烦。


profile配置方式:

□多profile文件方式
一个主配置文件、多个其他配置文件

需要启用其他配置文件的时候,要在主配置文件中激活

#激活application-dev.yml文件
spring.profiles.active=dev

□yml多文档方式
一个配置文件、分隔符 --- 分割为多个配置文档


profile激活方式:

□配置文件激活(上面就是用的配置文件激活)

□虚拟机参数激活

□命令行参数
在IDEA中:

在IDEA之外:
   打开工程jar包所在目录,打开cmd
   运行jar文件:java -jar .\\文件名.jar
   指定参数运行:java -jar .\\文件名.jar --spring.profiles.active=dev

2.5 内部配置加载顺序

Springboot程序启动时,会从以下位置加载配置文件:

  1. file:./config/:当前项目下的/config目录下
  2. file:./ :当前项目的根目录
  3. classpath:/config/:classpath的/config目录
  4. classpath:/ :classpath的根目录

2.6 外部配置加载顺序

官网查看:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html

Externalized Configuration

3.整合其他框架

3.2 整合Junit

Ⅰ 搭建SpringBoot工程:
   FilenewMavenSpring Initializr

Ⅱ 编写Service类

@Service
public class UserService 
    public void add()
        System.out.println("add...");
    

Ⅲ 编写测试类

@RunWith(SpringRunner.class)
/*
	注意:当测试类与引导类在同一个包下(或为Service的子包),classes = Application.class可以省略
*/
@SpringBootTest(classes = Application.class)
public class UserServiceTest 
    @Autowired
    private UserService userService;

    @Test
    public void testAdd()
        userService.add();
    

Ⅳ 运行测试类

3.2 整合redis

Ⅰ 搭建SpringBoot工程:
   FilenewModuleMavenSpring InitializrNoSQL √Spring Data Redis

Ⅱ 编写测试类

@SpringBootTest
class Demo1ApplicationTests 
    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    public void testSet() 
        //存入数据
        redisTemplate.boundValueOps("name").set("zhangsan");
    

    @Test
    public void testGet()
        //获取数据
        Object name = redisTemplate.boundValueOps("name").get();
        System.out.println(name);
    

Ⅲ 打开redis-server.exe,运行程序,运行单元测试

注意:非本机redis配置

spring:
  redis:
    host: 127.0.0.1 #redis对应主机名
    port: 6379  #redis端口号

3.2 整合mybatis

Ⅰ 搭建SpringBoot工程:
   FilenewModuleMavenSpring InitializrSQL √Mybatis Framework √mysql Driver

Ⅱ 定义表和实体类

CREATE DATABASE IF NOT EXISTS `springboot`;

USE `springboot`;

CREATE TABLE `user`(
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `password` VARCHAR(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`)
)ENGINE=INNODB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;


INSERT  INTO `t_user`(`id`,`username`,`password`) VALUES (1,'zhangsan','123'),(2,'lisi','456');

public class User 
    private int id;
    private String username;
    private String password;

    public int getId() 
        return id;
    

    public void setId(int id) 
        this.id = id;
    

    public String getUsername() 
        return username;
    

    public void setUsername(String username) 
        this.username = username;
    

    public String getPassword() 
        return password;
    

    public void setPassword(String password) 
        this.password = password;
    

    @Override
    public String toString() 
        return "User" +
                "id=" + id +
                ", username='" + username + '\\'' +
                ", password='" + password + '\\'' +
                '';
    

Ⅲ 编写映射文件

@Mapper
public interface UserMapper 
    @Select("select * from user")
    public List<User> findAll();

Ⅳ 配置application.yml

# database
spring:
  datasource:
    driver: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql:///springboot?serverTimezone=UTC
    username: root
    password: admin

Ⅴ 编写测试类

@SpringBootTest
class Demo1ApplicationTests 

    //注入Mapper
    @Autowired
    private UserMapper userMapper;

    @Test
    public void testFindAll() 
        List<User> list = userMapper.findAll();
        System.out.println(list);
    

Ⅶ 运行测试类


若采用xml配置

Ⅲ 编写映射文件

@Mapper
public interface UserXmlMapper 
    public List<User> findAll();

<?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.example.demo.UserXmlMapper">
    <select id="findAll" resultType="user">
        select * from user;
    </select>
</mapper>

Ⅳ 配置application.yml

#database
spring:
  datasource:
    driver: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql:///springboot?serverTimezone=UTC
    username: root
    password: admin

# mybatis
mybatis:
  mapper-locations: classpath:mapper/UserMapper.xml # mapper映射文件路径
  type-aliases-package: com.example.demo  #User包地址

Ⅴ 编写测试类

@RunWith(SpringRunner.class)
@SpringBootTest
class Demo3ApplicationTests 

    @Autowired
    private UserXmlMapper userXmlMapper;

    @Test
    public void testFindAll() 
        List<User> list = userXmlMapper.findAll();
        System.out.println(list);
    

以上是关于SpringBoot Ⅰ的主要内容,如果未能解决你的问题,请参考以下文章

全栈编程系列SpringBoot整合Shiro(含KickoutSessionControlFilter并发在线人数控制以及不生效问题配置启动异常No SecurityManager...)(代码片段

SpringBoot中表单提交报错“Content type ‘application/x-www-form-urlencoded;charset=UTF-8‘ not supported“(代码片段

Spring boot:thymeleaf 没有正确渲染片段

11SpringBoot-CRUD-thymeleaf公共页面元素抽取

学习小片段——springboot 错误处理

SpringBoot Features