还在从零开始搭建项目?这款基于SpringBoot 3的快速开发脚手架值得一试!

关注我Github的小伙伴应该了解,之前我开源了一款快速开发脚手架mall-tiny,该脚手架完整继承了mall项目的技术栈,拥有完整的权限管理功能。最近抽空把该项目支持了Spring Boot 3,今天再和大家聊聊这个脚手架,同时聊聊升级项目到Spring Boot 3 的一些注意点,希望对大家有所帮助!

聊聊mall-tiny项目

可能有些小伙伴还不了解这个脚手架,我们先来聊聊它!

项目简介

mall-tiny是一款基于SpringBoot+MyBatis-Plus的快速开发脚手架,目前在Github上已有1600+Star。它拥有完整的权限管理功能,支持使用MyBatis-Plus代码生成器生成代码,可对接mall项目的Vue前端,开箱即用。

项目地址:github.com/macrozheng/...

项目演示

mall-tiny项目可无缝对接mall-admin-web前端项目,秒变前后端分离脚手架,由于mall-tiny项目仅实现了基础的权限管理功能,所以前端对接后只会展示了权限管理相关菜单。

前端项目地址:github.com/macrozheng/...

技术选型

这次升级不仅支持了Spring Boot 3,其他依赖版本也升级了。

技术 版本 说明
SpringBoot 3.1.5 容器+MVC框架
SpringSecurity 6.1.5 认证和授权框架
MyBatis 3.5.10 ORM框架
MyBatis-Plus 3.5.3 MyBatis增强工具
MyBatis-Plus Generator 3.5.3 数据层代码生成器
SpringDoc 2.0.2 文档生产工具
Redis 5.0 分布式缓存
Docker 18.09.0 应用容器引擎
Druid 1.2.14 数据库连接池
Hutool 5.8.9 Java工具类库
JWT 0.9.1 JWT登录支持
Lombok 1.18.30 简化对象封装工具

数据库表结构

化繁为简,仅保留了权限管理功能相关的9张表,业务简单更加方便定制开发,觉得mall项目学习太复杂的小伙伴可以先学习下mall-tiny。

接口文档

由于Swagger依赖从SpringFox升级到了SpringDoc,原来的接口文档访问路径已经改变,最新访问地址:http://localhost:8080/swagger-ui/index.html

使用流程

升级版本基本不影响之前的使用方式,具体使用流程可以参考最新版README文件:github.com/macrozheng/...

升级过程

接下来我们再来聊聊mall-tiny项目升级Spring Boot 3 版本主要的过程,如果你的项目也想升级Spring Boot 3 的话,了解下应该会有所帮助!

升级JDK 17

由于Spring Boot 3 版本最低要求为Java 17,所以我们在运行项目时需要修改项目使用的SDK为JDK 17。

升级SpringDoc

  • 由于之前使用的SpringFox提供的Swagger库,已经三年多没更新了,也不支持Spring Boot 3,所以我们需要迁移到能支持Spring Boot 3 的SpringDoc去。
  • 我们需要修改项目的依赖,从SpringFox迁移到SpringDoc,
xml 复制代码
<!--SpringDoc 官方Starter-->
<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
    <version>2.0.2</version>
</dependency>
  • 然后修改Controller和实体类上使用的SpringFox注释,主要是替换@Api@ApiOperation@ApiModel@ApiModelProperty注解,具体替换参考下表。
SpringFox SpringDoc
@Api @Tag
@ApiIgnore @Parameter(hidden = true)or@Operation(hidden = true)or@Hidden
@ApiImplicitParam @Parameter
@ApiImplicitParams @Parameters
@ApiModel @Schema
@ApiModelProperty @Schema
@ApiOperation(value = "foo", notes = "bar") @Operation(summary = "foo", description = "bar")
@ApiParam @Parameter
@ApiResponse(code = 404, message = "foo") ApiResponse(responseCode = "404", description = "foo")

升级Spring Security 6

从Spring Security 5升级到6,有很多之前使用的API都废弃了,我们需要把这些废弃的用法改成Spring Security 6的新用法。

例如在SecurityConfig类中,就有这些方法已经弃用了,我们需要修改下。

还有就是之前实现动态权限的DynamicAccessDecisionManager和DynamicSecurityFilter类也已经被弃用了。

我们需要写一个类实现AuthorizationManager接口用于实现我们之前的动态权限逻辑,其实写法比以前更简洁了。

java 复制代码
/**
 * 动态鉴权管理器,用于判断是否有资源的访问权限
 * Created by macro on 2023/11/3.
 */
public class DynamicAuthorizationManager implements AuthorizationManager<RequestAuthorizationContext> {

    @Autowired
    private DynamicSecurityMetadataSource securityDataSource;
    @Autowired
    private IgnoreUrlsConfig ignoreUrlsConfig;

    @Override
    public void verify(Supplier<Authentication> authentication, RequestAuthorizationContext object) {
        AuthorizationManager.super.verify(authentication, object);
    }

    @Override
    public AuthorizationDecision check(Supplier<Authentication> authentication, RequestAuthorizationContext requestAuthorizationContext) {
        HttpServletRequest request = requestAuthorizationContext.getRequest();
        String path = request.getRequestURI();
        PathMatcher pathMatcher = new AntPathMatcher();
        //白名单路径直接放行
        List<String> ignoreUrls = ignoreUrlsConfig.getUrls();
        for (String ignoreUrl : ignoreUrls) {
            if (pathMatcher.match(ignoreUrl, path)) {
                return new AuthorizationDecision(true);
            }
        }
        //对应跨域的预检请求直接放行
        if(request.getMethod().equals(HttpMethod.OPTIONS.name())){
            return new AuthorizationDecision(true);
        }
        //权限校验逻辑
        List<ConfigAttribute> configAttributeList = securityDataSource.getConfigAttributesWithPath(path);
        List<String> needAuthorities = configAttributeList.stream()
                .map(ConfigAttribute::getAttribute)
                .collect(Collectors.toList());
        Authentication currentAuth = authentication.get();
        //判定是否已经实现登录认证
        if(currentAuth.isAuthenticated()){
            Collection<? extends GrantedAuthority> grantedAuthorities = currentAuth.getAuthorities();
            List<? extends GrantedAuthority> hasAuth = grantedAuthorities.stream()
                    .filter(item -> needAuthorities.contains(item.getAuthority()))
                    .collect(Collectors.toList());
            if(CollUtil.isNotEmpty(hasAuth)){
                return new AuthorizationDecision(true);
            }else{
                return new AuthorizationDecision(false);
            }
        }else{
            return new AuthorizationDecision(false);
        }
    }
}

升级MyBatis-Plus

  • mall-tiny脚手架使用了Mybatis-Plus,需要升级到3.5.3版本支持SpringBoot 3;
xml 复制代码
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.3</version>
</dependency>
  • Mybatis-Plus代码生成器还需配置支持SpringDoc。

总结

今天分享了下我的开源项目脚手架mall-tiny,以及它升级Spring Boot 3 的过程。我们在写代码的时候,如果有些用法已经废弃,应该尽量去寻找新的用法来使用,这样才能保证我们的代码足够优雅!

项目地址

开源不易,觉得项目有帮助的小伙伴点个Star支持下吧,Spring Boot 3 版本目前在3.x分支下。

github.com/macrozheng/...

相关推荐
七折困1 分钟前
列表、数组排序总结:Collections.sort()、list.sort()、list.stream().sorted()、Arrays.sort()
java·集合·数组·排序
苹果酱056721 分钟前
一文读懂SpringCLoud
java·开发语言·spring boot·后端·中间件
掐指一算乀缺钱41 分钟前
SpringBoot 数据库表结构文档生成
java·数据库·spring boot·后端·spring
晚睡早起₍˄·͈༝·͈˄*₎◞ ̑̑1 小时前
苍穹外卖学习笔记(七)
java·windows·笔记·学习·mybatis
就这个java爽!1 小时前
JAVA网络编程【基于TCP和UDP协议】超详细!!!
java·开发语言·网络·tcp/ip·udp·eclipse·idea
一叶飘零_sweeeet1 小时前
为什么 Feign 要用 HTTP 而不是 RPC?
java·网络协议·http·spring cloud·rpc·feign
飞翔的佩奇1 小时前
xxl-job适配sqlite本地数据库及mysql数据库。可根据配置指定使用哪种数据库。
数据库·spring boot·mysql·sqlite·xxl-job·任务调度
懒洋洋大魔王1 小时前
7.Java高级编程 多线程
java·开发语言·jvm
茶馆大橘1 小时前
【黑马点评】已解决java.lang.NullPointerException异常
java·开发语言
星辰@Sea1 小时前
服务注册中心对比及使用场景分析
java·云原生