SpringBoot 01:入门与基础配置


SpringBoot 01:入门与基础配置

简介

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

Spring与Spring Boot对比

Spring: Spring框架是最流行的Java应用程序开发框架。 Spring框架的主要功能是依赖注入控制反转(IoC)。借助Spring Framework,我们可以开发一个松耦合的应用程序。如果纯粹定义应用程序类型或特征,最好使用。

SpringBoot: Spring Boot是Spring Framework的模块。它允许我们构建具有最少配置或零配置的独立应用程序。如果我们要开发一个简单的基于Spring的应用程序或RESTful服务,最好使用它。

我们使用传统的Spring框架存在许多缺点:

  • 需要引入很多包
  • 需要进行很多XML的配置,例如Spring/Spring MVC的XML、MyBatis的XML等

而Spring boot就是为了解决使用Spring遇到的上述缺点而设计的

  • 原则:约定优于配置

  • 让开发人员由更多时间来关注业务逻辑

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

注意事项:基于idea开发SpringBoot程序需要确保联网且能够加载到程序框架结构

SpringBoot的特点

  1. 项目只要引入Spring boot即可,Spring boot负责配置其他的框架
  2. starters管理自动依赖和版本控制
  3. 自动配置,有默认值,必要时可以修改默认值,不需要自己些xml,也不需要写代码
  4. 开箱即用
  5. 非业务功能的特性由Spring Boot提供,如安全、指标、生产环境监控等
  6. 支持云计算
  7. Springboot本质是提供了更加便捷的Spring的使用方式,其底层还是SpringFramework实现的

入门程序

1.创建新模块,选择Spring初始化,并配置模块相关基础信息。

配置模块

配置模块

2.选择当前模块需要使用的技术集

选择当前模块需要使用的技术集

3.开发控制器类

@RestController
@RequestMapping("/books")
public class BookController {
    @GetMapping("/{id}")    
    public String getById(@PathVariable Integer id){
    System.out.println("id ==> "+ id);
    return "hello , spring boot! ";    
    }
}

4.运行自动化生成的Application类

自动化生成的Application类

前后端分离情况

当我们的项目为前后端分离时,为了能够使前端的同学能够快速打开我们的java项目,我们应当找到一个方法来快速启动springboot项目。

快速启动SpringBoot项目

1.对SpringBoot项目打包(执行Maven构建指令package)

项目打包

2.执行启动指令

java –jar springboot.jar

jar支持命令行启动需要依赖maven插件支持,请确认打包时是否具有SpringBoot对应的maven插件

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

SpringBoot概述

SpringBoot正是因为帮我们配置了一系列starter依赖,所以才让我们的开发变得简便。听我说,谢谢你,boot侠!

起步依赖

起步依赖

这些都是springboot提供的依赖,已经帮我们写好了各种各样的jar包依赖,包括版本号artifactIdgourpId等。

starter

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

parent

  • 所有SpringBoot项目要继承的项目,定义了若干个坐标 版本号(依赖管理,而非依赖),以达到减少依赖冲突的目的

  • 不同版本的SpringBoot所使用的依赖差别较大,例如:spring-boot-starter-parent(2.5.0)与 spring-boot-starter-parent(2.4.6)共计57处坐标版本不同

注意

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

SpringBoot程序启动

启动方式

@SpringBootApplication
 public class Springboot01QuickstartApplication {
   public static void main(String[] args) {
     SpringApplication.*run*(Springboot01QuickstartApplication.class, args);
   }
}
  • SpringBoot在创建项目时,采用jar的打包方式
  • SpringBoot的引导类是项目的入口,运行main方法就可以启动项目

使用maven依赖管理变更起步依赖项

原来的tomcat用吐了,来换一个jetty服务器吧

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

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

基本配置

如何修改服务器默认端口?(例如8080端口 -> 80端口)

答:采用配置文件修改

第一种配置文件格式:修改resources目录下的配置文件application.properties

server.port=80

第二种配置文件格式:新建一个yml配置文件

server:
  port: 80

第三种配置文件格式:新建一个yaml配置文件

server:
  port: 80

post向80端口发送请求

这样端口修改成功,就可以通过localhost的80端口直接访问了。

以后再开发中,我们主要写yml这种配置文件格式。

如果三种配置文件都存在,谁生效?

答:properties优先级最高,其次yml,最后yaml。

注意事项:SpringBoot内置属性过多,且所有属性集中在一起修改,在使用时,通过提示键+关键字修改属性。

yaml格式

YAML是”YAML Ain’t Markup Language”(YAML不是一种标记语言)的递归缩写,然而开发这种语言时,YAML的意思其实是”Yet Another Markup Language”(仍是一种标记语言),本质其实是一种数据序列化格式

优点:

  • 容易阅读
  • 容易与脚本语言交互
  • 以数据为核心,重数据 轻格式

YAML文件扩展名

  • yml(主流)
  • yaml

yaml语法规则

  • 大小写敏感

  • 属性层级关系使用多行描述,每行结尾使用冒号结束

  • 使用缩进表示层级关系,同层级左侧对齐,只允许使用空格(不允许使用Tab键

  • 属性值前面添加空格(属性名与属性值之间使用冒号+空格作为分隔)

  • # 表示注释

  • 普通的值,包括数字,字符串,布尔值

    • 字符串,字符串默认不加引号。如果需要的字符串本身就是一个数字,或者布尔值,需要使用引号(单引号or双引号)。双引号引起的内容,支持特殊字符转义,例如”aaa \n bbb”。单引号引起的内容,不支持特殊字符转义。如果字符串中包含[ ] -> 用于表示结构的字符,需要使用引号、单引号。
  • 对象,有key-value写法,行内写法

  • 核心规则:数据前面要加空格与冒号隔开

spring:
  aop:
    auto: on
  info:
    build:
      encoding: utf-8 
  dao:
    exceptiontranslation:
      enabled: on
  

Spring boot 获取数据

yaml数组数据

数组数据在数据书写位置的下方使用减号作为数据开始符号,每行书写一个数据,减号与数据间空格分隔。

student:
  name: 银色回廊
  age: 100
  tel: 13888888888
  subject:
    - java
    - 后端
    - 数据库
    - 算法

spring boot读取yaml数据

@RestController
@RequestMapping("/books")
public class BookController {

    @Value("${student.name}")
    private String Name;

    @Value("${student.subject[0]}")
    private String subject_00;

    @GetMapping("/{id}")
    public String getById(@PathVariable Integer id){
        System.out.println(Name);
        System.out.println(subject_00);
        return "hello , spring boot!";
    }
}

environment自动装配数据

通过Environment类可以实现从配置文件读取数据到Environment类中,然后中这个类中获取数据

@RestController
@RequestMapping("/books")
public class BookController {
    @Autowired
    private Environment environment;
    @GetMapping("/{id}")
    public String getById(@PathVariable Integer id){
        System.out.println(environment.getProperty("environment.getProperty("student.name")"));
        System.out.println(environment.getProperty("environment.getProperty("student.age")"));
        System.out.println(environment.getProperty("environment.getProperty("student.tel")"));
        System.out.println(environment.getProperty("environment.getProperty("student.subject[0]")"));
        return "hello , spring boot!";
    }
}

自定义对象封装注入数据

新建一个domain包,创建student类,读取配置文件中指定名称的数据,进行匹配

@Component
@ConfigurationProperties(prefix = "student")
public class Student {
    private String name;
    private Integer age;
    private String tel;
    private String[] subject;

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

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

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

再看Controller类中,通过Environment获取配置文件中的内容

@RestController
@RequestMapping("/books")
public class BookController {
    @Autowired
    private Student student;
    @GetMapping("/{id}")
    public String getById(@PathVariable Integer id){
        System.out.println(student);
        return "hello , spring boot!";
    }
}

自定义封装可能会出现一个警告,只要加上一个依赖就可以解决

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-configuration-processor</artifactId>
   <optional>true</optional>
 </dependency>

对注入的数据进行JSR303数据校验

首先引入一个依赖

<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
</dependency>

在@ConfigurationProperties数据注入模式下,对对应的属性进行校验

注意事项:@Value 与 @ConfigurationProperties的区别

项目 @ConfigurationProperties @Value
作用 用于整个对象的注入,要求变量名与key值对应 单个值的注入,不要求变量名与key值对应
松散结构映射
SPEL
JSR303数据校验
符合数据类型 支持 不支持

多环境开发配置

yaml文件格式

# 设置启动环境
spring:
  profiles:
    active: dev

# 以前的写法
---
# 开发
spring:
  profiles: dev
server:
  port: 80
---
# 生产
spring:
  profiles: pro
server:
  port: 81
---
# 测试
spring:
  profiles: test
server:
  port: 82
---
# 新版写法(推荐)
# 开发(新版写法)
spring:
  config:
    activate:
      on-profile: dev1
server:
  port: 80

properties多文件格式

主启动配置文件application.properties

spring.profiles.active=pro

环境分类配置文件application-pro.properties

server.port=80

环境分类配置文件application-dev.properties

server.port=81

环境分类配置文件application-test.properties

server.port=82

在application.properties / application.yaml / application.yml 以外建立配置文件

需要在要注入数据的类上添加以下注解

@PropertySource(value = {"classpath:<其他配置文件路径和名字>"})

另外,Spring Boot能够像Spring一样应用XML格式的配置文件和类,需要在启动类添加注解

@ImportResource(locations = {"classpath:<其他配置文件路径和名字>"})

当然,纯注解的配置类加上@Configuration,@Bean也是支持的。

多环境启动

当开发的环境转移到测试的环境时需要进行对应的修改,对已经打包的文件,我们可以使用多环境启动格式来进行配置。

启动格式:

带参数启动SpringBoot

java –jar springboot.jar –-spring.profiles.active=test

当要临时改端口时

java –jar springboot.jar –-server.port=88 –-spring.profiles.active=test

参数加载优先顺序

参考https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-external-config

参数加载优先顺序

Application Properties

16类配置参数项文档(Application Properties):Spring properties

作用:自动配置(见Springboot02:@EnableAutoConfiguration)

传入参数为多个环境的情况

在启动一个Spring应用程序的时候,可以传入一个或多个环境。-Dspring.profiles.active=test,master,那最终会以哪个为准呢?

先合并配置,如果有冲突,后面的覆盖前面的。

配置文件分类

SpringBoot中4级配置文件

1级: (target的上一层:<current_dir>)/config/(xx/)application.yml 【最高】

2级: (target的上一层:<current_dir>)/application.yml

3级:<classpath>/config/application.yml

4级:<classpath>/application.yml 【最低】

作用:

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

配置文件中的占位符和随机符

占位符

让配置文件中,当前属性能够访问其他属性,这个时候需要用到占位符。

a=silvercorridors.cf
b=blog.${a} 

此时a就被当作了占位符,b的值就为blog.silvercorridors.cf

如果事先没有a这个属性的值,可以在占位符中添加默认的缺省值(default_value)

b=blog.${a:silvercorridors.cf} 

这样写,b的值也为blog.silvercorridors.cf

随机符

当配置文件中需要让一个key产生随机的value,需要用到随机符${radom.xxx}

r1=${random.int} # 产生一个int型随机数 32位
r2=${random.long} # 产生一个long型随机数 64位
r3=${random.long(100)}  # 产生一个100以内的long型随机数 0-99
r4=${random.long[101,200]}  # 产生一个101~200范围内的long型随机数 101~200
r5=${random.value} # 随机产生一个md5值
r6=${random.uuid} # 随机产生一个uuid值
r7=id${random.int[101,999]} # 支持字符串拼接

SpringBoot 整合MyBatis

①:创建新模块,选择Spring初始化,并配置模块相关基础信息

②:选择当前模块需要使用的技术集(MyBatis、MySQL)

③:设置数据源参数

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql:///travel
    username: root
    password: 123456
    type: com.alibaba.druid.pool.DruidDataSource
  • 注意:SpringBoot版本低于2.4.3(不含),Mysql驱动版本大于8.0时,需要在url连接串中配置时区,或在MySQL数据库端配置时区解决此问题

④:定义数据层接口与映射配置

@Mapper
public interface userDao {
    @Select("select * from user")
    void getAllUsers();
}

⑤:测试类中注入dao接口,测试功能

@SpringBootTest
class Springboot05MybatisApplicationTests {
    @Autowired
    private userDao userDao;
    @Test
    void contextLoads() {
        List<User> allUsers =
                userDao.getAllUsers();
        allUsers.forEach(System.out::println);
    }
}

运行结果:

配置Mybatis的输出结果

SpringBoot真的很方便。

知识点:Spring Boot实现热部署

什么是热部署?

热部署,就是在应用正在运行的时候升级软件(增加业务/修改bug),却不需要重新启动应用。

大家都知道在项目开发过程中,常常会改动页面数据或者修改数据结构,为了显示改动效果,往往需要重启应用查看改变效果,其实就是重新编译生成了新的Class文件,这个文件里记录着和代码等对应的各种信息,然后Class文件将被虚拟机的ClassLoader加载。

而热部署正是利用了这个特点,它监听到如果有Class 文件改动了,就会创建一个新的 ClaassLoader进行加载该文件,经过一系列的过程,最终将结果呈现在我们眼前,Spring Boot通过配置DevTools工具来达到热部署效果。

原理:使用了两个ClassLoader,一个ClassLoader加载那些不会改变的类(第三方Jar包),另一-个
ClassLoader加载会更改的类,称为restart ClassLoader,这样在有代码更改的时候,原来的restart ClassLoader被丢弃,重新创建一一个 restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间。

环境配置

1.配置devtools环境

(1)在springboot项目中添加devtools依赖:

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

(2)同时在plugin中添加devtools生效标志:

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
        <fork>true</fork>
    </configuration>
</plugin>

devtools可以实现页面热部署( 即页面修改后会立即生效,这个可以直接在application.properties文件中配置spring.thymeleaf.cache=false来实现) , 实现类文件热部署(类文件修改后不会立即生效), 实现对属性文件的热部署。

即devtools会监听classpath下的文件变动,并且会立即重启应用(发生在保存时机),因为其采用的虚拟机机制,该项重启是很快的。配置了后在修改java文件后也就支持了热启动,不过这种方式是属于项目重启. (速度比较快的项目重启), 会清空session中的值,也就是如果有用户登陆的话,项目重启后需要重新登陆。

默认情况下,/META-INF/maven, /META-INF/resources, /resources, /static, /templates, /public 这些文件夹下的文件修改不会使应用重启,但是会重新加载( devtools内嵌了一个LiveReload server,当资源发生改变时,浏览器刷新)

2.全局配置文件配置

在application.yml文件中配置spring.devtools.restart.enabled,如下:

#开启热部署
devtools:
restart:
enabled: true
###设置重启的目录
additional-paths: src/main/java
###解决项目自动重新编译后接口报404的问题
poll-interval: 3000
quiet-period: 1000

3.idea设置

当我们修改了Java类后,IDEA 默认是不自动编译的,而spring boot devtools又是监测classpath下的文件发生变化才会重启应用,所以需要设置IDEA的自动编译。

(1)自动编译配置

自动编译配置

(2)设置自动修改

自动修改选项

(3)测试

测试代码controller类

@Controller
public class MyController {
    @RequestMapping("/r1")
    @ResponseBody
    public String r1(){
        return "Hello World, r1 here!";
    }
}

Postman请求

修改测试代码,点击图标,或者ctrl+F9实现热部署重新加载

测试

热部署成功实现

Postman再次发送请求

知识点:SpringBoot常见项目结构

通常的项目结构

  • 项目根目录/src/main/java:放置项目Java源代码
  • 项目根目录/src/main/resources:放置项目静态资源和配置文件
  • 项目根目录/src/test/java:放置项目测试用例代码

代码层结构

|_annotation:放置项目自定义注解
|_aspect:放置切面代码
|_config:放置配置类
|_constant:放置常量、枚举等定义
   |__consist:存放常量定义
   |__enums:存放枚举定义
|_controller:放置控制器代码
|_filter:放置一些过滤、拦截相关的代码
|_mapper:放置数据访问层代码接口
|_model:放置数据模型代码
   |__entity:放置数据库实体对象定义
   |__dto:存放数据传输对象定义
   |__vo:存放显示层对象定义
|_service:放置具体的业务逻辑代码(接口和实现分离)
   |__intf:存放业务逻辑接口定义
   |__impl:存放业务逻辑实际实现
|_utils:放置工具类和辅助代码

资源文件结构

|_mapper:存放mybatis的XML映射文件(如果是mybatis项目)
|_static:存放网页静态资源,比如下面的js/css/img
   |__js:
   |__css:
   |__img:
   |__font:
   |__等等
|_template:存放网页模板,比如thymeleaf/freemarker模板等
   |__header
   |__sidebar
   |__bottom
   |__XXX.html等等
|_application.yml       基本配置文件
|_application-dev.yml   开发环境配置文件
|_application-test.yml  测试环境配置文件
|_application-prod.yml  生产环境配置文件

参考资料

Spring Boot 2.7版本 实现热部署


文章作者: 银色回廊
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 银色回廊 !
评论
  目录