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-

相关推荐
毕设源码-钟学长4 小时前
【开题答辩全过程】以 基于Springboot的扶贫众筹平台为例,包含答辩的问题和答案
java·spring boot·后端
程序员良许5 小时前
三极管推挽输出电路分析
后端·嵌入式
Java水解5 小时前
【JAVA 进阶】Spring AOP核心原理:JDK与CGLib动态代理实战解析
后端·spring
Java水解5 小时前
Spring Boot 4 升级指南:告别RestTemplate,拥抱现代HTTP客户端
spring boot·后端
宫水三叶的刷题日记5 小时前
工商银行今年的年终奖。。
后端
大黄评测5 小时前
双库协同,各取所长:.NET Core 中 PostgreSQL 与 SQLite 的优雅融合实战
后端
神云瑟瑟5 小时前
spring boot拦截器获取requestBody的最佳实践
spring boot·拦截器·requestbody
Java编程爱好者5 小时前
Java 后端定时任务怎么选:@Scheduled、Quartz 还是 XXL-Job?
后端
Java编程爱好者5 小时前
线程池用完不Shutdown,CPU和内存都快哭了
后端
神奇小汤圆5 小时前
Unsafe魔法类深度解析:Java底层操作的终极指南
后端