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-

相关推荐
shark_chili3 分钟前
基于arthas量化监控诊断java应用方法论与实践
后端
+VX:Fegn08955 分钟前
计算机毕业设计|基于springboot + vue在线考试管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
okseekw10 分钟前
Java泛型从入门到实战:原理、用法与案例深度解析
java·后端
雨中飘荡的记忆12 分钟前
Spring WebFlux详解
java·后端·spring
文攀14 分钟前
Go 语言 GMP 调度模型深度解析
后端·go·编程语言
银嘟嘟左卫门15 分钟前
使用openEuler进行多核性能测评,从单核到多核的极致性能探索
后端
徐行code18 分钟前
C++ 核心机制深度解析:完美转发、值类别与 decltype
后端
回家路上绕了弯21 分钟前
技术团队高效协作:知识分享与协作的落地实践指南
分布式·后端
JaguarJack21 分钟前
如何创建和使用 Shell 脚本实现 PHP 部署自动化
后端·php
qq_3482318532 分钟前
Spring Boot 项目集成模块- 2
spring boot·后端