跳转至

组件

内置tomcat,不用再部署war包。

项目初始化: https://start.spring.io/

📌 maven

管理项目依赖

  • 依赖安装: mvn install或者idea启动
  • 打包项目: mvn package
  • 启动项目: mvn spring-boot:run或者idea启动: application.main()

📌 MVC架构模式

model: 数据模型,提供要展示的数据

  • DAO,封装对数据库的访问
  • Service,负责协调业务逻辑

view: 数据展示,即前端页面

controller: 控制器,定义接口,负责接口的请求和响应

📌 配置

  • 连接池配置: hicari, 官方默认连接池
  • 日志配置: logback, 内置日志框架
  • 扩展日志配置: resources/logback.xml, 包括日志级别、存储时间、最大体积、sql打印至控制台
  • 自定义全局变量配置
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

// 自定义全局变量配置
@Component // 被修饰的类交给springboot管理
public class ScheduleJob{

    @Value("${var}") // 引用application.properties定义的变量
    private String tests; // 不能使用static,即常量
}

📌 flyway组件

数据库版本管理工具,迭代或者库表配置变动时,自动执行相关SQL。

个人理解: 类似Django的python manage.py migrate

  • SQL脚本命名规范V版本号__描述.sql,描述也不能重复,如: resources/db.migration/V1.0__init_demo.sql
  • SQL执行报错,需要将库表执行失败的记录删除,方能重新执行。

📌 mybatis框架

调用关系: Controller -> Service -> DAO -> mapper

实体类、DAO、xml映射

DTO(Data Transfer Object)数据传输对象,是一种设计模式,用于在不同层级或不同系统间传输数据。可以避免直接暴露实体类的细节,用来过滤和转换数据。

📌 lombok

定义Java类时通过注解,省去get/set方法编写。

import lombok.Data;
import lombok.NonNull;
import lombok.EqualsAndHashCode;

// @EqualsAndHashCode(callSuper = true) // 继承多个类时使用,避免实例化子类可能出现误判
@Data // 被装饰的类会自动生成get/set、toString()、equals()、hashCode()
@NoArgsConstructor // 生成一个全参数构造器
@AllArgsConstructor // 生成一个无参构造器
public class Demo {
//    @NonNull,使用该装饰器时会自动生成该参数的构造方法
    private String id;

    private String name;
}

📌 fastjson

json数据处理,json和实体类转换。

import com.alibaba.fastjson.JSONObject;

public static void main(String[] args) {
    JSONObject test = new JSONObject();
    test.put("id", "1");
    test.put("name", "test");
    Demo demo = JSONObject.toJavaObject(test, Demo.class);
    System.out.println(demo.getId());
}

📌 jwt

json web token

常见鉴权方式:

  • session: 存储于服务端,但分布式部署不适用
  • token: 生成token存储在redis
  • jwt: 格式为header.business.signature,由服务器生成,保存至客户端
    header: 公用配置,如编码等
    business: 业务信息,如存放用户名、过期时间等
    signature: 加密模块,包括密钥secret;单点登录安全要求较高的,可以让密钥动态生成,每隔数分钟重新生成。
public static String createToken(Demo demo) {
    // 生成token
    Date expireDate = new Date(System.currentTimeMillis() + EXPIRATION * 1000); //过期时间
    Map<String, Object> map = new HashMap<>();
    // header.business.signature
    // header
    map.put("alg", "HS256");
    map.put("typ", "JWT");
    String token = JWT.create()
            .withHeader(map) // 添加头部
            //可以将基本信息放到claims中
            // business
            .withClaim("id", demo.getId())
            .withClaim("name", demo.getName())
            .withExpiresAt(expireDate) // 超时设置,设置过期的日期
            .withIssuedAt(new Date()) // 签发时间
            // signature
            .sign(Algorithm.HMAC256(SECRET)); // SECRET加密
    return token;
}

📌 pagehelper

分页组件,在原SQL侵入limit等语句

import com.github.pagehelper.Page;

public class PageUtils {
    public static <T> PageDTO<T> setPageInfo(Page page, T obj) {
        try {
            PageDTO<T> pager = new PageDTO<>();
            pager.setList(obj);
            pager.setTotal(page.getTotal());
            pager.setPage(page.getPageNum());
            pager.setSize(page.getPageSize());
            return pager;
        } catch (Exception e) {
            throw new RuntimeException("Error saving current page number data!");
        }
    }
}
import lombok.Data;

@Data
public class PageDTO<T> {
    private T list;
    private long total;
    private int page;
    private int size;
}

📌 定时任务

  • Timer: Java自带的定时任务api
  • Scheduled: Springboot自带的注解
  • Quartz: 异步任务调度框架,已集成在Springboot,crontab存储在数据库中
  • XXL-JOB: 分布式定时任务,基于redis实现
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component
public class ScheduleJob {

    @Scheduled(cron = "0 0/1 * * * ?")
    public void Start(){
        System.out.println(new Date());
    }
}

📌 网关与拦截器

🚁 网关

多个微服务可能有多个域名、端口、登录方式等,通过网关统一鉴权、请求分发、请求过滤、请求日志记录、流量控制等。

注册中心

第三方注册中心:阿里-Nacos、百度-Dubbo、Apache-ZooKeeper、Netflix-Eureka 等,用于微服务的注册与发现。

🚁 拦截器

  • 请求拦截,对哪些接口做token验证
  • 鉴权管理
  • 请求分发

📌 响应模版定义

先定义响应状态码,配合响应拦截器@RestControllerAdvice,统一响应格式如: {"status":0,"message":{"成功"}}

运行时异常,则需定义异常类型处理@ExceptionHandler及对应的响应模版枚举值。

📌 工具类

hutools: https://doc.hutool.cn/pages/index/


参考资料:

1.完整项目代码