SpringBoot实用篇

一、运维实用篇

1.工程的打包与运行

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

②运行项目(执行启动指令)

java -jar 工程打包的文件名.jar

jar支持命令行启动需要依赖maven插件支持,请确认打包时是否具有SpringBoot对应的maven插件
注意事项
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

③问题

说明:springboot_08_ssmp-0.0.1-SNAPSHOT.jar中没有主清单属性

将pom.xml中的plugin中的mainclass中的skip属性删除

跳过测试过程(蓝色闪电)

2.打包插件

使用SpringBoot提供的maven插件可以将工程打包成可执行jar包 
    <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <configuration>
                    <mainClass>com.zhou.SSMPApplication</mainClass>
                    
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

jar包描述文件

Manifest-Version: 1.0
Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx
Implementation-Title: springboot_08_ssmp
Implementation-Version: 0.0.1-SNAPSHOT
Spring-Boot-Layers-Index: BOOT-INF/layers.idx
Start-Class: com.itheima.SSMPApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Build-Jdk-Spec: 1.8
Spring-Boot-Version: 2.5.4
Created-By: Maven Jar Plugin 3.2.0
Main-Class: org.springframework.boot.loader.JarLauncher(jar启动器)

3.Boot工程快速启动(Linux版)

没学p56

4.配置高级

①临时属性设置

java -jar springboot_08_ssmp-0.0.1-SNAPSHOT.jar --server.port=8080
携带多个属性启动Springboot,属性间使用空格分隔
        属性加载优先顺序:命令行的临时属性可覆盖yml文件中的属性

②在idea中测试临时属性

i.为程序添加运行属性(Program arguments)
ii.编程形式 
 //可以在启动boot程序时断开读取外部临时配置对应的入口,也就是去掉读取外部参数的形参
 //SpringApplication.run(SSMPApplication.class);

③配置文件的4级分类

1级:file: config/application.yml

2级:file:application.yml

3级:classpath:config/application.yml

4级:classpath:application.yml

④自定义配置文件

i.在Program arguments中

指定文件名:

--spring.config.name=ebank(配置文件名)

或指定文件路径:

--spring.config.loation=classpath:/ebank.yml(文件的全类名)

5.多环境开发

①yaml版

#应用环境
#会加载一些默认环境,公共配置
spring:
  profiles:
    active: pro
---
#设置环境
#区分这几个环境,通过spring.profiles起名字来区分
#生产环境
spring:
  config:
    activate:
      on-profile: pro
server:
  port: 80
---
#开发环境
spring:
  config:
    activate:
      on-profile: dev
server:
  port: 81
---
#测试环境
spring:
  config:
    activate:
      on-profile: test
server:
  port: 82

小结:设置多环境使用---区分环境设置边界

多环境开发多文件版

主配置文件中设置公共配置,环境分类配置文件中常用于设置冲突属性

②多环境开发多文件版(properties版)

注:properties文件多环境配置仅支持多文件格式

③多环境开发分组管理

后加载的覆盖前面加载的相同配置

版本升级后,用group替代include,定义了若干个环境组
spring:
  profiles:
    active: dev
    group:
      "dev": devDB,devMVC
      "pro": proDB,proMVC
但其配置顺序也发生了变化。
dev,devDB,devMVC

④多环境开发控制

 以maven配置为主,让springboot读取maven的配置

pom中定义了多环境,且在多个环境中都定义了profile.active的变量

springboot中引用maven属性

用@profile.active@

 基于SpringBoot读取Maven配置属性的前提下,如果在Idea下测试
工程时pom.xml每次更新需要手动compile方可生效

6.日志

①日志基础操作

在application.yml中设置

debug: true即可开启debug日志

i.在代码中使用日志工具记录日志
package com.zhou.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/books")
public class BookController {
//    创建记录日志的对象
    private static final Logger log= LoggerFactory.getLogger(BookController.class);
    @GetMapping
    public String getById(){
        System.out.println("springboot is a running...");
        log.debug("debug...");
        log.info("info...");
        log.warn("warn...");
        log.error("error...");
        return "springboot is a running...";
    }

}
ii.设置日志输出级别

root表示根节点,即整体应用日志级别

logging:
 level:
  root: debug

 升级版

logging:
  #  设置分组
  group: 
    ebank: com.zhou.controller
    iservice: com.alibaba
#    整体的日志级别为info
  level:
    root: info
#  设置分组,对某个组设置日志级别
   ebank: warn

②快速创建日志对象

使用lombok提供的注解@Slf4j简化开发,减少日志对象的声明操作

③日志输出格式控制

如何修改日志格式:
%d:时间
%m:消息
%n:换行
 pattern:
    console: "%d %clr(%5p) --- [%16t] %clr(%-40.40c){cyan} : %m %n"

④文件记录日志

设置日志文件(日志如何记录到文件里)

 file:
    name: server.log

设置日志文件的详细配置(滚动日志)

  file:
    name: server.log
  logback:
    rollingpolicy:
#      设置文件的大小
      max-file-size: 3KB
#    设置文件的命名格式
      file-name-pattern: server.%d{yyyy-MM-dd}.%i.log

%d:日期
%i:相当于循环变量i,从0开始

二、开发实用篇(能够基于springboot整合任意第三方技术)

1.热部署

服务器不用启动,修改完立马出效果=》热部署

①手动启动热部署

在pom.xml中添加开启开发者工具的依赖

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

激活热部署:Ctrl+F9(或点击idea中的Build中的Build project进行激活)

补充:关于热部署

重启(Restart):自定义开发代码,包含类、页面、配置文件等,加载位置restart类加载器

重载(ReLoad):jar包,加载位置base类加载器

注:热部署仅仅加载当前开发者自定义的资源,不加载jar资源

②自动启动热部署

设置自动构建项目

ctrl+ALT+shift+/:打开如下图Register

激活方式:idea失去焦点5秒后启动热部署

③热部署范围配置

热部署属于devtools jar包给我们带来的功能,隶属于springboot,

要修改热部署的范围即设置spring boot相关的操作

自定义设置不参与重启排除项:

 devtools:
   restart:
#     设置不参与热部署的文件或者文件夹,文件夹就用/**
     exclude: static/**,public/**,config/application.yml

④关闭热部署功能

只在开发环境下有效

当前操作可将热部署彻底关闭(设置高优先级的属性禁用热部署)

2.配置高级

自定义配置bean(先在yml中配置属性,再创建一个相关的配置类,最后通过容器获取bean)

①第三方bean属性绑定

使用@ConfigurationProperties为第三方bean绑定属性

application.yml

datasource:
  driverClassName: com.mysql.jdbc.Driver123

注:@EnableConfigurationProperties(ServerConfig.class),与ServerConfig类下的注解@Component冲突,不可同时使用
@ConfigurationProperties与@EnableConfigurationProperties的区别

@ConfigurationProperties:具体做属性绑定

@EnableConfigurationProperties:开启属性绑定,并设定对应的目标是谁,可以将使用@ConfigurationProperties注解对应的类加入Spring容器

解除使用@ConfigurationProperties注释警告

②松散绑定

@ConfigurationProperties绑定属性支持属性名宽松绑定

servers:
#  ipAddress: 192.168.0.1
#  ipAddress: 192.168.0.1 驼峰
#  ip_address: 192.168.0.1 underline
  ip-address: 192.168.0.1 # 烤肉串模式
#  IP_ADDRESS: 192.168.0.1 常量模式

注:

1.宽松绑定不支持注解@Value引用单个属性的方式

2.绑定前缀名命名规范:仅能使用纯小写字母,数字,下划线作为合法的字符

③常用计量单位的应用

springboot支持JDK8提供的时间与空间计量单位

@Data
@ConfigurationProperties(prefix = "servers")
public class ServerConfig {
    private String ipAddress;
    private int port;
    private long timeout;
//时间单位
    @DurationUnit(ChronoUnit.HOURS)
    private Duration serverTimeOut;
//存储空间单位
    @DataSizeUnit(DataUnit.MEGABYTES)
    private DataSize dataSize;

④bean属性校验

<!--        导入JSR303规范-->
        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
<!--            <version>2.0.1.Final</version>-->
        </dependency>
<!--        使用hibernate框架提供的校验器作实现类-->
        <dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
        </dependency>

对bean开启校验功能

//2.开启对当前bean的属性注入校验
@Validated
public class ServerConfig {
    private String ipAddress;
//    设置具体的规则
    @Max(value = 8888,message = "最大值不能超过8888")
    private int port;

⑤进制数据转换规则

yml中int 支持二进制,八进制和十六进制

八进制:0(0-7)

十六进制:0x(0-9,a-f)

注:如需使用字符串请使用引号明确标注

3.测试

①加载测试专用属性

在测试类中(args与properties同时使用时,args级别更高)

//properties属性可以为当前测试用例添加临时的属性配置
//@SpringBootTest(properties = {"test.prop=testValue"})
//args属性可以为当前测试用例添加临时的命令行参数,该参数也可以覆盖配置的属性
@SpringBootTest(args={"--test.prop=testValue1"})

②加载测试专用配置

使用@Import注解加载当前测试类专用配置

③测试类中启动web环境

数据层,业务层都可做测试,表现层也可以

在pom.xml中配置

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

在测试类中模拟端口

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)//随机端口
//@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)//默认端口
public class WebTest {
    @Test
    void test(){

    }

}

④发送虚拟请求

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)//随机端口
//@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)//默认端口
//开启虚拟MVC调用
@AutoConfigureMockMvc
public class WebTest {
    @Test
//  注入虚拟MVC调用对象  
    void test(@Autowired MockMvc mvc) throws Exception {
//        创建虚拟请求,当前访问/books
        MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.get("/books");
//执行请求
        ResultActions actions=mvc.perform(builder);
    }

⑤匹配响应执行状态

    @Test
//  注入虚拟MVC调用对象
    void testStatue(@Autowired MockMvc mvc) throws Exception {
//        创建虚拟请求,当前访问/books
        MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.get("/books");
//执行请求
        ResultActions actions=mvc.perform(builder);
//        设置预期响应值与真实值进行比较
//        定义本次测试的预期值
        StatusResultMatchers status = MockMvcResultMatchers.status();
//        预计本次成功的状态
        ResultMatcher ok = status.isOk();
//        添加预计值到本次调用过程中进行匹配
        actions.andExpect(ok);

⑥匹配响应体

//    匹配执行结果
        @Test
//  注入虚拟MVC调用对象
    void testBody(@Autowired MockMvc mvc) throws Exception {
//        创建虚拟请求,当前访问/books
        MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.get("/books");
//执行请求
        ResultActions actions=mvc.perform(builder);
            ContentResultMatchers content = MockMvcResultMatchers.content();
            ResultMatcher resultMatcher = content.string("springboot");
            actions.andExpect(resultMatcher);
        }

⑦匹配响应体(JSON)

与匹配响应体只有一点区别

⑧匹配响应头

     @Test
//  注入虚拟MVC调用对象
    void testHeader(@Autowired MockMvc mvc) throws Exception {
//        创建虚拟请求,当前访问/books
        MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.get("/books");
//执行请求
        ResultActions actions=mvc.perform(builder);
        HeaderResultMatchers header = MockMvcResultMatchers.header();
        ResultMatcher string = header.string("Content-Type", "application/json");
        actions.andExpect(string);
    }

⑨业务层测试回滚

业务层测试过后会留下数据,最好不要把数据装到数据库里。

为测试用例添加事务,springboot会对测试用例对应的事务提交操作进行回滚

@SpringBootTest
@Transactional
public class DaoTest {
    @Autowired
    private BookService bookService;

⑩测试用例设置随机数据

testcase:
  book:
    id: ${random.int}
    name: ${random.value}
    uuid: ${random.uuid}
    publishTime: ${random.long}

4.数据层解决方案

(1)SQL

①数据源配置

springboot提供了3种内嵌的数据源对象供开发者选择。

HikariCP(默认)url放在hikari外部

Tomcat提供DataSource:HikariCP不可用的情况下,且在web环境中,将使用tomcat服务器配置的数据源对象。

Commons DBCP:HikariCP不可用,tomcat数据源也不可用

Durid
#spring:
#  datasource:
#    driver-class-name: com.mysql.cj.jdbc.Driver
#    url: jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC
#    username: root
#    password: 123456
#    type: com.alibaba.druid.pool.DruidDataSource

Hikari
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC
    hikari:
      username: root
      password: 123456

基本
#spring:
#  datasource:
#    druid:
#     driver-class-name: com.mysql.cj.jdbc.Driver
#     url: jdbc:mysql://localhost:3306/ssm
#     username: root
#     password: 123456

②持久化技术(jdbcTemplate)

 @Autowired
    private JdbcTemplate jdbcTemplate;
    @Test
    void testJdbcTemplate(){
        String sql ="select * from tbl_book where id=1";
//        List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
//        System.out.println(maps);

        RowMapper<Book> rm=new RowMapper<Book>() {
            @Override
            public Book mapRow(ResultSet rs, int rowNum) throws SQLException {
                Book temp=new Book();
                temp.setId(rs.getInt("id"));
                temp.setName(rs.getString("name"));
                temp.setType(rs.getString("type"));
                temp.setDescription(rs.getString("description"));
                return temp;
            }
        };
        List<Book> list = jdbcTemplate.query(sql, rm);
        System.out.println(list);

    }

要用jdbcTemplate需要导入依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

jdbcTemplate配置

spring:
    jdbc:
        template:
            query-timeout: -1 #查询超时时间
            max-rows: 500  #最大行数
            fetch-size: -1 #缓存行数

③内置数据库

SpringBoot提供了3种内嵌数据库供开发者选择,提高开发测试效率

H2

HSQL

Derby(都是拿Java语言写的)

导入H2相关的坐标

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>

H2数据库控制台仅用于开发阶段,线上项目请务必关闭控制台功能。(enabled: false)

# h2数据库

server:
  port: 80
spring:
  h2:
    console:
      enabled: true
      path: /h2

  datasource:
    url: jdbc:h2:~/test1
    hikari:
      driver-class-name: org.h2.Driver//可不写
      username: sa
      password: 123456

(2)NoSQL

redis是一款key-value存储结构的内存级NoSQL数据库。

①redis里面在cmd中的清屏指令是clear。

key中镶嵌key-value

②idea中操作redis(springboot整合Redis)

先导入坐标,再安装yml配置,最后自动装配一个redisTemplate对象。

RedisTemplate提供操作各种数据存储类型的接口API:

③springboot读写Redis的客户端

客户端:StringRedisTemplate以字符串作为key和value,与Redis客户端操作等效

@SpringBootTest
public class StringRedisTemplateTest {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    @Test
    void get(){
        ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();
        String name = ops.get("name");
        System.out.println(name);

    }

④springboot操作Redis客户端实现技术切换(jedis)

导入依赖坐标

  <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
  </dependency>

配置客户端(默认lettuce)

spring:
  redis:
    host: localhost
    port: 6379
    client-type: jedis

  • 14
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值