SpringBoot工程web模式与非web模式和谐共处运行
最佳答案 问答题库488位专家为你答疑解惑
文章目录
- 概述
- 需求
- 解决方案一:剥离非web部分代码
- 方案一弊端
- 解决方案二:维护一套代码,指定以web或非web模式运行
- 1. 改造springboot启动类
- 2. 移除web上下文注入或添加生效前提
- 3.排除其他web模式下 AutoConfiguration 的类
- 按照方案二改造成功的项目
概述
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启动类
修改前
public static void main(String[] args){SpringApplication.run(GitApplication.class, args);}
改造后:
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对象的注入。
@AutowiredHttpServletRequest 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;}
改造为
// @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类
/*** * 非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-
99%的人还看了
相似问题
猜你感兴趣
版权申明
本文"SpringBoot工程web模式与非web模式和谐共处运行":http://eshow365.cn/6-12237-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!
- 上一篇: 【操作系统笔记一】程序运行机制CPU指令集
- 下一篇: 代码随想录训练营 DP