SpringBoot部分功能总结

查漏补缺,对SpringBoot相关技术进行总结!!!

1.SpringBoot的日志文件

在开发过程中,会经常使用到日志,下面对日志相关知识进行总结,方便之后的查阅。
slf4j
在springboot的底层日志结构中对应:spring-boot-starter-logging可以看出,它依赖了三个框架分别是:

  • slf4j
  • logback
  • log4j

那么,这三者是什么关系呢?我们实际开发中使用哪个呢?如何使用?

1、logback和log4j是日志实现框架,
2、slf4j:提供了java所有的日志框架的简单抽象(使用了日志的门面设计模式),
slf4j必须要结logbacklog4j日志框架来结合使用。

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  <
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值