SpringBoot

你好SpringBoot

1、快速搭建SpringBoot项目

1、创建新模块,选择Spring Initializr,并配置模块相关基础信息

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

3、开发控制器类

//REST模式
@RestController
@RequestMapping("/books")
public class BookController {
    @GetMapping
    public String getById(){
        System.out.println("SpringBoot is running...");
        return "SpringBoot is running";
    }
}

4.运行自动生成的Application类

uTools_1658674025073.png

2.入门案例分析

1、parent

开发SpringBoot程序要继承spring-boot-starter-parent

spring-boot-starter-parent中定义了若干个依赖管理

继承parent模块可以避免多个依赖使用相同技术时出现依赖版本冲突

继承parent的形式也可以采用引入依赖的形式实现效果

2、starter

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

实际开发:使用任意坐标时,仅书写GAV中的G和A,V由SpringBoot提供,除非SpringBoot未提供对应版本V

如果法神坐标错误,再指定Version(小心版本冲突)

3、引导类

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

SpringBoot工程运行后初始化Spring容器,扫描引导类所在包加载bean。

引导类默认扫描,当前引导类所在的包下所有bean。

4.内嵌Tomact

3、SpringBoot属性配置

1、修改服务器端口

GET  http://localhost:8080/books
修改为默认端口80就不需要写端口号。
GET  http://localhost/books

SpringBoot在resources下的application.properties中配置。

注意:

1.SpringBoot中导入对应的starter后,提供对应配置属性。

2.书写SpringBoot配置采用关键字+提示形式书写。

2、属性配置方式

SpringBoot提供了三种属性配置方式:application.properties/yml/yaml

企业开发推荐yml格式。

3、配置文件优先级

三个配置文件都存在,优先级:properties>yml>yaml

不同配置文件中相同配置按照加载优先级相互覆盖,不同配置文件中不同配置全部保留。

4、IDEA属性提示消失解决方案

​ FILE-->Prroject Structure-->Facets-->Customize Spring Boot添加配置文件。

image-20220727073239777

4、整合第三方技术

1.整合Junit

lombook 可以自动生成geterseter构造器方法

​ 1.导入测试对应的starter

​ 2.测试类使用@SpringBootTest修饰

​ 3.使用自动装配的形式添加要测试的对象

​ 名称:@SpringBootTest

​ 类型: 测试类注解

​ 位置: 测试类定义上方

​ 作用: 设置Junit加载的SpringBoot启动类

@SpringBootTest
class SpringTest{

}

classess属性

classes属性来指定配置类

@SpringBootTest(classes=SpringBootApplication.class)/@ContextConfiguration(引导类名.class)

注意:如果测试类在SpringBoot启动类的包或者子包中,可以省略启动类的设置,也就是省略classes的设定


2.整合Mybatis

1.创建一个模块在SQL选项中勾选MySQL Driver驱动和Mybatis Framework

2.在application.yml文件中设置数据源参数

# 设置数据源参数
spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://8.130.109.205:3306/Mybatis
    username: xxx
    password: xxx

3.定义数据层接口与映射配置

@Mapper
public interface UserDAO {
    @Select("select * from user where id = #{id}")
    public User getUserById(Integer id);
}

4.测试

@SpringBootTest
class DemoZhengheApplicationTests {

    @Autowired
    private UserDAO userDAO;

    @Test
    public void testDAO(){
        System.out.println(userDAO.getUserById(1));
    }
}

3.整合Mybatis-plus

1.手动添加SpringBoot整合Mybatis-Plus的坐标。

2.定义数据层接口与映射配置,继承baseMapper

4.整合Druid

spring:
	datasource:
		druid:
			druid-class-name:
			url:
			username:
			password:

5.SSMP整合案例

image-20220727170206894

1.创建模块

1.勾选SpringMVC和MySQL坐标、

2.修改配置文件

3.设置端口为80方便访问

4.手动添加MP坐标,druid坐标

2.数据层标准开发(基础CRUD)

1.开发DAO接口(继承BaseMapper)

​ Mp默认自增策略是雪花算法,可以将id-type设置为auto

mybatis-plus:
  global-config:
    db-config:
      id-type: auto

2.制作测试类测试DAO功能

3.开启MP运行日志

开启标准输出,输出到控制台。

mybatis-plus:
  global-config:
    db-config:
      id-type: auto
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

4.分页

1.设定分页对象IPage

IPage iPage=new Page(2,4);

Ipage对象中封装了分页操作中的所有数据。

2.配置MybatisPlus拦截器

分页操作是在MybatisPlus的常规操作基础上增强得到,内部是动态拼写SQL语句,因此需要增强对应的功能,是用MybatisPlus拦截器实现

@Configuration
public class MPConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return mybatisPlusInterceptor;
    }
}

5.条件查询

1.使用QueryWrapper对象封装查询条件,推荐使用LambdaQueryWrapper对象,所有查询操作封装成方法调用。LambdaQueryWrappe可以避免手动写属性名造成的错误,也 支持动态条件拼装。like前面的true、false。

    @Test
    public void getBy(){
        LambdaQueryWrapper<Book> qw = new LambdaQueryWrapper<>();
        String name="Spring"; 
        qw.like(name!=null,Book::getName,name);
        bookDAO.selectList(qw);
    }

6.业务层标准开发

1.Service接口名称定义成业务名称,并与DAO接口进行区分

2.制作测试类测试Service功能是否有效

7.业务层快速开发(基于MP)

1.使用MP提供的业务层通用接口(IService)与业务层通用实现类(ServiceImpl<M,T>)

2.在通用类基础上做功能重载或功能追加

3.注意重载时不要覆盖原始操作,避免原始提供的功能丢失。

7.表现层开发

1,基于Restful制作表现层接口

​ POST/DELETE/PUT/GET

2, 接受参数

​ 实体数据:@RequestBody

​ 路径变量:@PathVariable

8.表现层消息一致性处理

​ 设计表现层返回结果的模型类,用于后端与前端进行数据格式同意,也成为前后端数据协议。

@Data
public class R {
    private boolean flag;
    private Object data;
    public R(){}
    public R(boolean flag){
        this.flag=flag;
    }
    public R(boolean flag,Object data){
        this.flag=flag;
        this.data=data;
    }
}

1.设计统一的返回值结果类型便于前端开发读取数据

2.返回值结果类型可以根据需求自行设定,没有固定格式

3.返回值结果模型类用于后端与前端进行数据格式统一,也称前后端数据协议

9.前后端调用(axios发送异步请求)

1.单体项目中页面放置在resources/static目录下

2.created钩子函数用于初始化页面时发起调用

3.页面使用axious发送异步请求获取数据后确认前后端是否联通

10.异常消息处理

SpringMVC中提供异常处理器

//作为springmvc的异常处理器
@RestControllerAdvice
public class ProjectExceptionAdvice {
    //拦截所有的异常信息
    @ExceptionHandler(Exception.class)
    public R doException(Exception ex){
        //记录日志
        //通知运维
        //通知开发
        ex.printStackTrace();
        return new R("服务器内部故障");
    }
}

1.使用注解@RestControllerAdvice定义SpringMVC异常处理

2.异常处理器必须被扫描加载,否则无法生效

3.表现层返回结果的模型类中添加消息属性用来传递消息到页面

SpringBoot运维实用

1.程序打包与运行(windows)

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

​ mvn package

​ 2.运行项目(执行启动指令)

​ java -jar springboot.jar

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

image-20220730093908158

使用SpringBoot提供的maven插件可以将工程打包成可执行jar包。

可执行jar包目录结构

image-20220730102951038

jar包描述文件

image-20220730103017365

2.linux

​ 1.安装jdk,且版本不低于打包时使用的JDK版本

​ 2.安装包保存在/usr/local/自定义目录中或$HOME下

​ 3,其他操作参照windows版进行。

nohup java -jar SSMP-0.0.1-SNAPSHOT.jar > server.log 2>&1 &

后台开启进程。

2.配置高级

1.临时属性

java -jar SSMP-0.0.1-SNAPSHOT.jar --server.port=8080

携带多个属性启动SpringBoot,属性间使用空格分隔

属性加载顺序

2.临时属性设置(开发环境)

1.带属性启动SpringBoot程序,为程序添加运行属性

image-20220730212247788

2.通过编程的形式带参数启动SpringBoot程序,为程序添加运行参数

@SpringBootApplication
public class SsmpApplication {

    public static void main(String[] args) {
        String[] arg=new String[1];
        arg[0]="--server.port=8080";
        SpringApplication.run(SsmpApplication.class, arg);
    }

}

3.配置文件四级分类

SpringBoot中4级配置文件

​ 1级 file : config/application.yml 最高

​ 2级 file : application.yml

​ 3级 classpath : config/application.yml

​ 4级 classpath : application.yml 最低

作用:1级与2级留做系统打包后设置通用属性,1级常用于运维进行线上整体项目部署方案调控

3级与4级用于系统开发阶段设置通用属性,3级常用于项目经理进行整体项目属性调控

4.自定义配置文件

1.通过启动参数加载配置文件(无需书写配置配置文件扩展名)

image-20220731153229770

2.通过启动参数加载指定文件路径下的配置文件

image-20220731153311046

注意多个配置,最后一个配置生效。

重要说明:

​ 单服务器项目: 使用自定义配置文件需求较低

​ 多服务器项目: 使用自定义配置文件需求较高,将所有配置放置在一个目录中,统一管理

​ 基于SpringCloud技术,所有的服务器将不再设置配置文件 ,而是通过配置中心进行设定,动态加载配置信息。

3.多环境开发

1.YMAL版

1.多环境开发需要设置若干种常见环境,例如开发,生产,测试环境

2.yaml格式中设置多环境使用---区分环境设置边界

3.每种环境的区别在于加载的配置属性不同

4.启用某种环境时需要指定启动时使用该环境

image-20220731160003065

#应用环境
#公共配置
spring:
  profiles:
    active: dev
---
#设置环境
#生产环境
server:
  port: 80
spring:
  profiles: pro
---
#开发环境
server:
  port: 81
spring:
  profiles: dev
---
#测试环境
server:
  port: 82
spring:
  profiles: test

2.多环境开发多文件版(ymal)

1.主启动配置文件application.yml

spring: 
	profiles:
		active: dev

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

server:
	port :80

3.application-dev.yml

server:
	port:82

...

3.多环境分组管理

1.根据功能对配置文件中的信息进行拆分,并制作成独立的配置文件,命名规则如下

​ application-devDB.yml

​ application-devRedis.yml

​ application-devMVC.yml

2.使用include属性在激活指定环境的情况下,同时对多个环境进行加载使其生效,多个环境使用逗号分割

spring:
	profiles:
		active: dev
			include: devDB,devRedies,devMVC

注意:当主环境dev与其他环境有相同属性时,主环境属性生效;其他环境中有相同属性时,最后加载的环境属性生效。、

3.从springboot 2.4 开始使用group属性替代include属性,降低了配置书写量

使用group属性定义多种主环境与子环境的包含关系

spring:
	profiles:
		active: dev
		group:
			"dev": devDB,devRedis,devMVC
			"pro": proDB,proRedis,proMVC
			"test": testDB,testRedis,testMVC

4.多环境开发控制

Maven与SpringBoot多环境兼容

1.Maven中设置多环境属性

image-20220801134149899

2.SpringBoot中引用Maven属性

image-20220801134226107

3.执行Maven打包指令,并在生成的boot打包文件.jar文件中查看对应信息

image-20220801134555860

4.日志

1.日志基础操作

1.日志作用

​ 编程期调试代码

​ 运营期记录信息

​ 记录日常运营重要信息(峰值流量,平均响应时长......)

​ 记录应用报错信息(错误堆栈)

​ 记录运维过程数据(扩容,宕机,报警......)

2.代码中使用日志工具记录日志

1.添加日志记录操作

public class BookController {
    //创建记录日志的对象
    private static final Logger logger= LoggerFactory.getLogger(BookController.class);
    @Autowired
    private IBookService iBookService;
    @GetMapping
    public R getAllBooks(){
        logger.info("info......");
        logger.debug("debug.......");
        logger.warn("warn....");
        logger.error("error...");
        return new R(true,iBookService.list());
    }
}

日志级别:

TRACE:运行堆栈级别,使用率低

DEBUG:程序员调试代码使用

INFO:记录运维过程数据

WARN:记录运维过程报警数据

ERROR:记录错误堆栈信息

FATAL:灾难信息,合并计入ERROR

2.设置日志的输出级别

# 开启debug模式,输出调试信息,常用于检查系统运行状况
debug:true
# 设置日志级别,root表示根节点,即整体应用日志级别
logging:
	level:
		root: debug
         #对某个组设置日志级别
         ebank: warn

设置某个包的日志级别

com.springboot.controller: debug

设置分组,对某个组设置日志级别

logging: 
	group:
		ebank: 包名,包名

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

2.日志输出格式控制

1.设置日志消息格式

pattern:
	console: ""

3.日志文件

1.设置日志文件

logging:
	file:
		name: server.log

2.日志文件详细配置

logging:
	file:
		name: server.log
	logback:
		rollingpolicy:
			max-file-size: 3KB
			file-name-pattern: server.%d{yyyy-MM-dd}.%i.log

%d是日期,%i是循环变量

SpringBoot开发实用

1.热部署

1.手动启动热部署

在pom.xml文件中开启开发者工具

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

激活热部署: Ctrl+ F9 (Build Project)

热部署:

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

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

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

2.自动热部署

1.File-->Settings-->compiler-->Build project automatically

2.Ctrl+Alt+Shift+/

3.compiler.automake.xxx勾选

3.热部署范围配置

设置不参与热部署的文件或者文件夹。

devtools:

​ restart:

​ exclude: xxxx

4.关闭热部署

enable: false

设置高优先级属性禁用热部署

System.setProperty("spring.devtools.restart.enabled","false");

2.配置高级

1.第三方bean属性绑定

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

@EnableConfigurationProperties注解可以将使用@ConfigurationProperties注解对应的类加入Sping容器

@EnableConfigurationProperties和@component不能同时使用。

image-20220802141224853

2.松散绑定

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

public class Serverconfig{
	private String ipAddress;
	private int port;
	private long timeout;
}

image-20220802145952891

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

3.常用计量单位应用

Duration 时间数据类型

@DurationUnit()

DataSize 空间数据类型

@DataSizeUnit()

image-20220802172314897

4.数据校验

开启数据校验有助于系统安全性,J2EE规范中JSR303定义了一组有关数据校验相关的API

1.导入JSR303规范validation

2.开启对当前bean的属性注入校验@Validated

3.指定校验规则

4.使用hibernate框架提供的校验器做实现类

进制数据转换规则

yaml文件中对于数字的定义支持进制书写格式,如需要使用字符串请使用引号明确标注。

3.测试

1.加载测试专用属性

@SpringBootTest(properties={"test.prop=testValue1"})

properties属性可以为当前测试用例添加临时的属性配置

@SpringBootTest(args={"--test.prop=testValue2"})

args属性可以为当前测试用例添加临时的命令行参数

2.加载测试专用配置

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

3.测试类中启动web环境

image-20220805150923601

4.发送虚拟请求

1.开启虚拟MVC调用

@AutoConfigureMockMvc

自动装配一个MockMvc

2.创建虚拟请求,当前访问 /books

MockHttpServletRequestBuilder builder=MockMvcRequestBuilders.get("/books");

3.执行请求

mvc.perform(build)

5.匹配响应执行状态

4.数据层解决方案

1.数据源配置

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

HikariCP(默认)

Tomcat提供DataSource

Commons DBCP

2.JdbcTemplate

SpringBoot内置JdbcTemplate持久化解决方案

使用JdbcTemplate需要导入spring-boot-starter-jdbc

5.整合redis

1.导入SpringBoot整合Redis坐标

spring-boot-starter-data-redis

2.配置Redis

spring:
	redis:
		host: localhost
		port: 6379

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

image-20220811075805183

4.使用自动装配注入RedisTemplate对象

客户端:RedisTemplate以对象作为key和value。内部对数据进行序列化

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

5.jedis客户端实现技术

lettcus与jedis区别

​ jedis连接Redis服务器是直连模式,当多线程模式下使用jedis会存在线程安全问题,解决方案可以通过配置连接池使每个连接专用,这样整体性能就大受影响

​ lettcus基于netty框架进行与Redis服务器连接,底层设计中采用StatefulRedisConnection。StatefulRedisConnection自身是线程安全的,可以保障并发访问安全问题,所以一个连接可以被多线程复用。当然lettcus也支持多连接实例一起工作。

6.Mongdb

image-20220811105930192

7.ES(Elasticsearch)

分布式全文搜索引擎

倒排索引:

​ 数据--主键id--数据

image-20220811213331568

开发实用2.0

1.缓存

1.SpringBoot默认缓存方案导入坐标

spring-boot-starte-cache

2.开启SpringBoot单节点缓存功能

在Spring启动项中加上 @EnableCaching注解

在方法上加上

@Cacheable(value="cacheSpace",key="#id")注解

@Cacheable(value="cacheSpace",key="#id")
public Book getById(Integer id){
	return bookDao.selectById(id);
}
posted @ 2022-09-10 16:38  程序员包子  阅读(310)  评论(0编辑  收藏  举报