查漏补缺,对SpringBoot相关技术进行总结!!!
这里写目录标题
1.SpringBoot的日志文件
在开发过程中,会经常使用到日志,下面对日志相关知识进行总结,方便之后的查阅。
在springboot的底层日志结构中对应:spring-boot-starter-logging
可以看出,它依赖了三个框架分别是:
- slf4j
- logback
- log4j
那么,这三者是什么关系呢?我们实际开发中使用哪个呢?如何使用?
1、logback和log4j是日志实现框架,
2、slf4j:提供了java所有的日志框架的简单抽象(使用了日志的门面设计模式),
slf4j必须要结logback和log4j日志框架来结合使用。
springboot2.x以后默认采用了:slf4j+logback的日志搭配。
在开发过程中,我们可以采用slf4j的api去记录日志,底层的实现就是根据配置文件来决定使用logback还是log4j日志框架。
使用
private static final Logger log = LoggerFactory.getLogger(类名.class);
调用log.info(“日志信息,自定义的”);
日志级别
一般用info(默认info)
log.trace("----------trace--------");
log.debug("----------debug--------");
log.info("----------info--------");
log.warn("----------warn--------");
log.error("----------error--------");
顺序是:trace>debug>info>warn>error
比如:日志级别是info的,则打印info、warn、error
日志级别的修改
配置文件yaml修改
# 指定日志级别 把springboot的所有日志修改成为debug
logging:
level:
root: debug
日志输出文件
默认情况下关闭
logging:
file:
#路径
path: output/logs
#日志输出方式,文件、控制台
pattern:
file:
console:
日志格式
%c 输出logger名称
%C 输出类名
%d{HH:mm:ss.SSS} 表示输出到毫秒的时间
%t 输出当前线程名称
%-5level 输出日志级别,-5表示左对齐并且固定输出5个字符,如果不足在右边补0
%logger 输出logger名称,因为Root Logger没有名称,所以没有输出
%msg 日志文本
%n 换行
其他常用的占位符有:
%F 输出所在的类文件名,如Log4j2Test.java
%L 输出行号
%M或%method 输出所在方法名
%l 输出完整的错误位置, 包括类名、方法名、文件名、行数
%p 该条日志的优先级
%replace{pattern}{regex}{substitution} 将pattern的输出结果pattern按照正则表达式regex替换成substitution
lombok优化日志的定义
注解:@Slf4j
和@Log4j2
建议在开发过程中就默认选择:@Slf4j
日志级别隔离
在实际开发中,分为生成环境和开发环境。开发环境的级别一般使用:debug
或者info
,在生产环境中建议一般使用error
所以,有了环境隔离的概念,生产环境使用appliaction-prod.yaml配置文件,开发环境使用application-dev配置文件。
如何切换?
# 环境激活
spring:
profiles:
active: dev
#active: prod
2.SpringBoot整合Swagger
Swagger是什么
Swagger是依赖内嵌
在项目中的一款在线文档测试工具
怎么用
1、导入pom依赖
<!-- Swagger -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<!-- 文档 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
<exclusions>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</exclusion>
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
<version>1.5.21</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>swagger-bootstrap-ui</artifactId>
<version>1.8.5</version>
</dependency>
2、定义和开启swagger的配置类
@Configuration
@EnableSwagger2
public class SwaggerConfiguration {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(getApiInfo())
.select()
// 核心:读取把那个包下面的方法作为接口,只能是:controller
.apis(RequestHandlerSelectors.basePackage("com.zwh.slf4j.config"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo getApiInfo() {
return new ApiInfoBuilder()
.title("学习Swagger")
.description("Swagger在线文档")
.termsOfServiceUrl("")
.version("1.0")
.build();
}
}
Swagger访问地址
旧版
http://localhost:8080/swagger-ui.html
新版
http://localhost:8080/doc.html
注:只能访问controller,因为只有这一层才和前端交互,这才是swagger的作用所在。
常用注解
@Api :用在类上,说明该类的作用
@ApiImplicitParams :用在方法上包含一组参数说明
@ApiResponses :用于表示一组响应
@ApiOperation() 用于方法;表示一个http请求的操作
* value用于方法描述
* notes用于提示内容
* tags可以重新分组(视情况而用)
@ApiParam() 用于方法,参数,字段说明;表示对参数的添加元数据(说明或是否必填等)
* name–参数名
* value–参数说明
* required–是否必填
@ApiModel()用于类 ;表示对类进行说明,用于参数用实体类接收
* value–表示对象名
* description–描述
* 都可省略
@ApiModelProperty()用于方法,字段; 表示对model属性的说明或者数据操作更改
* value–字段说明
* name–重写属性名字
* dataType–重写属性类型
* required–是否必填
* example–举例说明
* hidden–隐藏
@ApiIgnore()用于类或者方法上,可以不被swagger显示在页面上 比较简单, 这里不做举例
@ApiImplicitParam() 用于方法
* 表示单独的请求参数
@ApiImplicitParams() 用于方法,包含多个 @ApiImplicitParam
* name–参数ming
* value–参数说明
* dataType–数据类型
* paramType–参数类型
3.SpringBoot中的异步处理框架@Async
何时使用异步
大部分开发中,是使用串行执行的。但是,在一些特殊情况下,当一个业务和另外一个业务的关联性不是强耦合,执行失败或者成功都不影响它核心业务。就可以将这些业务剥离处理用异步执行。比如在用户注册中,有发送短信和发送邮件的业务逻辑
异步编程的框架:消息中间件(ActiveMQ、RabbitMQ)
如何使用异步处理框架
1、打开springboot的异步处理框架
在springboot的启动类上添加@EnableAsync,开启异步
2、定义个异步处理的注册service
service层方法上加上@Async
@Service
@Slf4j
public class RegService {
@Async
public void sendMsg(){
// todo :模拟耗时5秒
try {
Thread.sleep(5000);
log.info("-----发送消息-----");
}catch (Exception ex){
ex.printStackTrace();
}
}
@Async
public void addScore(){
// todo :模拟耗时5秒
try {
Thread.sleep(5000);
log.info("-----处理积分-----");
}catch (Exception ex){
ex.printStackTrace();
}
}
}
3、调用异步处理
controller层调用service的方法
@RestController
@Slf4j
public class RegController {
@Autowired
private RegService regService;
@GetMapping("reg")
public String reguser() {
// 1: 注册用户
log.info("新用户注册");
//dosomething
// 2: 发送短信
log.info("发送短信");
regService.sendMsg();
// 3: 添加积分
log.info("添加积分");
regService.addScore();
return "ok";
}
}
总结
使用@Async来实现异步代码逻辑,但是这种方法还是使用java代码来实现,会通过JVM来占用内存。之后,随着业务的升级,可以使用消息中间件来进行异步处理。
4.封装统一返回的R类
将controller的返回封装成一个java类,R.java或者Result.java
成功只有一种情况,失败才有很多种情况!!!
根据自己的需要调整
注意,建议构造函数使用private(构造函数私有化)
原因:让调用过程变得单一,只允许用类去调用方法,不允许用new去调用
private int code;
private String msg;
private T data;
/**
* 成功时候的调用
* */
public static <