SpringBoot工程web模式与非web模式和谐共处运行

文章目录

概述

Spring Boot 是 Pivotal 团队在 Spring 的基础上提供的一套全新的开源框架,其目的是为了简化 Spring 应用的搭建和开发过程。Spring Boot 去除了大量的 XML 配置文件,简化了复杂的依赖管理。

Spring Boot 具有 Spring 一切优秀特性,Spring 能做的事,Spring Boot 都可以做,而且使用更加简单,功能更加丰富,性能更加稳定而健壮。随着近些年来微服务技术的流行,Spring Boot 也成了时下炙手可热的技术。

需求

假设我们现在有一个已经开发好的Spring Boot web项目,现在我们想要复用非web部分代码,并且希望能独立运行(不启用web服务的情况下)。

解决方案一:剥离非web部分代码

此方案是最容易想到的办法,具体就是新建springboot 非web项目,去除 spring-boot-starter-web 相关依赖和代码后调试。

方案一弊端

需要维护2套代码,并需要手工保证2套非web部分功能代码的相对一致,代码维护麻烦

解决方案二:维护一套代码,指定以web或非web模式运行

1. 改造springboot启动类

修改前

java 复制代码
   public static void main(String[] args)
    {
        SpringApplication.run(GitApplication.class, args);
    }

改造后:

java 复制代码
   public static void main(String[] args)
    {
        boolean web = !ArrayUtils.contains(args, "--noWeb");
        log.info("############### with Web Configuration: {} #############", web);
        new SpringApplicationBuilder(GitApplication.class).web(web ? WebApplicationType.SERVLET : WebApplicationType.NONE).run(args);
    }

2. 移除web上下文注入或添加生效前提

针对controller类中,类似下文代码,移除HttpServletRequest等注入,当然也需要移除包含 RequestMappingHandlerMapping、HttpServletRequest、HttpSession、ServletContext 等web对象的注入。

java 复制代码
  
    @Autowired
    HttpServletRequest request;
    
    @Operation(summary = "系统信息")
    @GetMapping(value = "/info")
    public Map<String, String> info()
        throws UnknownHostException
    {
        Map<String, String> infoMap = new HashMap<String, String>(2);
        infoMap.put("client_ip", IPUtils.getIpAddr(request));
        infoMap.put("server_ip", InetAddress.getLocalHost().getHostAddress());
        log.info("================== profile: {}", SpringContextUtils.getActiveProfile());
        staticCode.print();
        StaticCode2.print();
        return infoMap;
    }

改造为

java 复制代码
  
    // @Autowired
    // HttpServletRequest request;
    
    @Operation(summary = "系统信息")
    @GetMapping(value = "/info")
    public Map<String, String> info(HttpServletRequest request)
        throws UnknownHostException
    {
        Map<String, String> infoMap = new HashMap<String, String>(2);
        infoMap.put("client_ip", IPUtils.getIpAddr(request));
        infoMap.put("server_ip", InetAddress.getLocalHost().getHostAddress());
        log.info("================== profile: {}", SpringContextUtils.getActiveProfile());
        staticCode.print();
        StaticCode2.print();
        return infoMap;
    }

或者在针对 controller 添加 @ConditionalOnWebApplication 注解

3.排除其他web模式下 AutoConfiguration 的类

目前遇到的情况是非web模式下运行排除knife4j 自动注册类

添加DisableWebAutoConfig类

java 复制代码
/**
 * 
 * 非web环境下禁用AutoConfiguration
 * 
 * @author 00fly
 * @version [版本号, 2023年4月4日]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
@Configuration
@ConditionalOnNotWebApplication
@EnableAutoConfiguration(exclude = Knife4jAutoConfiguration.class)
public class DisableWebAutoConfig
{
    
}

按照方案二改造成功的项目

https://gitee.com/00fly/effict-side/tree/master/springboot-git

https://gitee.com/00fly/effict-side/tree/master/springboot-hello

有任何问题和建议,都可以向我提问讨论,大家一起进步,谢谢!

-over-

相关推荐
wei_shuo1 分钟前
数据迁移工具实战:KDMS自动化评估与量化决策体系解析
后端
Lightpwd30 分钟前
Spring Boot 多数据源落地:AbstractRoutingDataSource + 注解切面(附源码)
数据库·后端
乱码三千32 分钟前
使用ComfyUI+MinMax-H3音视频模型生成视频
前端·后端·github
Shinomiya34 分钟前
最近在学进程调度和环境变量,记点心得
后端
分支预测失败36 分钟前
RISC-V 核间中断 IPI 实战:从 MSIP 寄存器到 IMSIC 消息投递
linux·后端
用户850869276151 小时前
Rust系统编程在任务调度中的踩坑与优化之路
后端
LiaCode2 小时前
别让 AI 把仓库写成“代码平行宇宙”:从 Deslop 看生成前查重
前端·后端·github
啵啵啵鱼2 小时前
DS-顺序表
java·数据结构·笔记·后端·链表·obsidian
回家吃饭去吧2 小时前
AI Agent Function Calling / Tool Use 深度解析
后端
大黄评测2 小时前
Oracle 锁等待、会话阻塞故障复盘:生产事故排查步骤
后端