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-

相关推荐
林太白2 分钟前
Next.js超简洁完整篇
前端·后端·react.js
前端付豪2 分钟前
汇丰登录风控体系拆解:一次 FaceID 被模拟攻击的调查纪实
前端·后端·架构
翻滚吧键盘9 分钟前
Package vs. Directory (包 vs. 目录)
spring boot
无名之逆13 分钟前
大三自学笔记:探索Hyperlane框架的心路历程
java·开发语言·前端·spring boot·后端·rust·编程
yang_xiao_wu_13 分钟前
springboot+mybatis面试题
spring boot·后端·mybatis
Chuck1sn15 分钟前
我把 Cursor AI 整合到 Ruoyi 中,从此让 Java 脚手架脱离人工!
java·vue.js·后端
水木石画室18 分钟前
Spring Boot 常用注解面试题深度解析
java·spring boot·后端
阿杆20 分钟前
想体验出海应用赚钱?试试这个一年免费的香港服务器
后端·产品·创业
汤圆和烟灰儿39 分钟前
Linux 防火墙工具 iptables 入门与常用命令整理
后端
bcbnb39 分钟前
iOS性能调试完整流程实录:工具组合下的问题定位与修复实践(含keymob)
后端