Skip to content

Spring Boot 3.0 引入了多个新特性和改进,但具体的属性变化需要根据官方文档和发布说明来确定。从 Spring Boot 2.x 升级到 3.0 的过程中,一些配置属性被重新命名、删除或添加。这里列出一些可能的变化和新增的特性,但请注意,对于具体新增的属性列表,建议直接查阅官方文档或使用 spring-boot-properties-migrator 模块帮助识别变化。

参考书

https://weread.qq.com/web/reader/43d328d0813ab8b5ag014fd1

https://weread.qq.com/web/reader/6b932700813ab83aag013f7a

Spring Boot 3支持最低的Maven版本为3.5

技术选型

当面对相同的应用场景而行业中有多种常用技术可选择时,会使用不同的技术实现,以便进行横向对比,充分了解各种技术的优点,如分别使用MyBatis和Spring Data JPA实现持久层。

Spring Data JPA底层是Hibernate引擎,可根据实体类自动建表

而当解决同一个场景问题出现技术更替,但旧技术还没有被完全淘汰时,则会进行纵向对比,如先用jQuery实现,然后替换成Vue。

权限管理模块:

使用RBAC(Role-Based Access Control,基于角色的访问控制)模型进行权限管理模块的设计。

RBAC通过角色与角色、角色与权限将用户进行关联。每个用户拥有若干个角色,每个角色拥有若干权限,这样就构成了“用户—角色—权限”的授权模型,这是当前行业中权限设计最为合理的方案。

RBAC主要涉及用户、角色、权限三个实体,它们之间是多对多的关系。

image-20240225195330751

项目中的实体有Employee(员工)、Department (部门)、User(用户)、Role(角色)和Permission(权限)。其中,Employee和Department是多对一的关系,

在关系数据库中,多对一和一对多的表关系需要在多的一方建立关联列,在关联列上可以建立外键约束,也可以不建。

比如Employee和Department多对一的关系,需要在Employee类中添加类型为Department的dep属性

多对多的表关系要通过建立一张关系表来确立。

为了避免与安全框架Spring Security中User的混淆,可对用户、角色、权限三个实体名统一加“Sys”前缀。

在面向对象的设计中,SysUser类和SysRole类是多对多的关系,需要在SysUser类中添加泛型为SysRole的List类型的roles属性。

如果要建立多对多的双向关联,则需要在SysRole方添加泛型为SysUser的List类型的属性。

项目目录结构

entity包:实体包。

controller包:控制器包,即Spring MVC类存放的位置。

service包:业务逻辑接口包。

service.impl包:业务逻辑实现类包。

dao包:数据库访问接口包,即MyBatis接口存放的位置。

util包:工具包。项目所涉及的配置文件统一放到resources文件夹下。

mapper文件夹:MyBatis映射文件。

AOP

引入依赖

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

拦截微信小程序登录日志

java
@Component
@Aspect
@Slf4j
public class LogPrint {

    @Before("execution(* cn.diyai.service.impl.MPServiceImpl.code2Session(..))")
    public void methodBegin(JoinPoint joinPoint){
        log.info("{} {} 微信小程序登录(begin)",joinPoint.getTarget(),joinPoint.getSignature());
    }

    @After("execution(* cn.diyai.service.impl.MPServiceImpl.code2Session(..))")
    public void methodEnd(JoinPoint joinPoint){
        log.info("{} {} 微信小程序登录(end)",joinPoint.getTarget(),joinPoint.getSignature());
    }
}