会员登录 - 用户注册 - 设为首页 - 加入收藏 - 网站地图 Spring 使用兼并之路(一):摸石头过河!

Spring 使用兼并之路(一):摸石头过河

时间:2025-05-22 01:44:22 来源:锐评时讯 作者:男性 阅读:757次

作者:京东。科技。李君。

公司。最近一年在推动降本增效,在竭尽各种手法之后,发现运用太多,每个运用都做跨机房容灾布置,则最少需求 4 台机器(称为容器更适宜)。那么,将附近运用做一个兼并,削减保护项目,进步机器利用率便是一个可选计划。

。

通过前后三次不同的折腾,最终探究出来一个可行计划。记载一下,共享出来,期望对有相关需求的研制童鞋有所协助。下面依照四种九天的计划,别离做介绍。别的,为了便利做演示,专门整了两个演示项目:

。

•diguage/merge-demo-boot — 兼并项目,下面简称为 boot。

•diguage/merge-demo-web — 被兼并项目,下面简称为 web。

。

一、Jar 包引证。

。

这个方法,九天是给人形象最简略的方法。细心考虑一下,从保护性的视点来看,这个方法反而是最费事的方法,理由如下:

。

1.web 项目每次更新,都需求从头打包发布新版; boot 项目也需求跟着更新发布。拉一次屎,脱两次裤子。事实费事。

2.还需求考虑 web 项目的加载问题,相似下面要描绘的,是否共用容器:共用容器 — 这是最容器想到的方法。可是这种方法,需求处理 Bean 抵触的问题。不共用容器 — 这种方法需求处理 web 容器怎么加载的问题。默许应该是无法辨认。

3.。

依据这些考虑,这种方法直接被抛弃了。

。

二、库房兼并,抱歉一套容器。

。

这是第一次测验运用的计划。也是遇到问题最多的计划。

。

1.将两个库房做兼并。

1.将 web 库房的地址装备到 boot 项目里: git remo。te。ad。d web gitgithub.com:diguage/merge-demo-web.git;

2.在 boot 项目里,切出来一个分支: git switch -c web;

3.将 web 分支的提交清空: git update-ref -d HEAD,然后做一次提交;

4.将 web 项目的代码克隆到 web 分支上: git pull --rebase --allow-unrelated-hist。or。ies web master;留意,这儿需求加 --allow-unrelated-histories。 参数。,以答应不相干的库房进行兼并。

5.从 boot 项目的 master 分支上,切出来一个兼并分支: git switch -c merge;

6.将 web 项目向 boot 项目兼并: git merge --allow-unrelated-histories web;留意,这儿需求加 --allow-unrelated-histories 参数,以答应不相干的库房进行兼并。

7.处理代码抵触,完结兼并即可。

2.装备文件的兼并于归整。为了避免同名装备文件抵触,需求把 web 项目的装备文件调整到一个文件夹下,这儿设定为 web 目录。然后,需求把 web 项目的装备文件,让 boot 能够加载到。这个调整相对简略,只需求一个注解即可 ImportResource({"classpath:web/spring-cfg.xml"})。

3.调整完装备文件,接着遇到的问题便是上面说到的 Bean 抵触的问题。因为两个项目都拜访相同的数据库, Dao 及 Serv。ic。e 层许多许多类都是同名的。别的,在 web 项目里,Dao 是依据 iBATIS 开发的,而在 boot 项目里,DAO 是依据 MyBATIS 开发的。所以,只能给 web 项目的相关代码做重命名(谨慎一点是给 Spring Bean 的 beanName 做重命名操作)。这又带来了新问题:本来的项目里,注入方法是依据称号注入的,就需求改动许多的代码,给相关的 Bean 变量做重命名操作。这无形中增加了许多的复杂度和不确定性。

。

通过不断折腾,这种方法被逼抛弃。

。

三、库房兼并,Spring Boot 父子容器。

。

在通过上述方法折腾后,就想到了别的一个计划:能够考虑运用父子容器的方法来搞。接着就查到了这篇文章: Context Hierarchy with the Spring Boot Fluent Builder A。PI。。感觉这种方法挺不错,就测验了一下。

。

1.代码兼并及文件调整,跟上述过程相似,这个后边就不再赘述。

2.依照文章中的介绍,运用父子容器的方法来加载两个项目。代码如下:

3.原以为,这种方法归于父子两个容器,即便有同名的 Bean 应该也没有影响。可是,通过实践才发现,上面这个猜想是过错的。Spring Boot 在耳濡目染的时分,它背面做了检查,假如两个容器有同名的 Bean,它也会报错。也会带来像上述方法那样的许多重命名。折腾一两天,最终仍是抛弃了这种寄予厚望的方法。

p。ac。kage com.diguage.demo.boot;import org.springframework.boot.WebApplica。ti。onType;import org.springframework.boot.builder.SpringApplicationBuilder;import org.springframework.context.annotation.ComponentS。can。;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.ImportResource;/** * author D瓜哥 · https://www.diguage.com */public class DemoBootApplication {    public static void main(String[] args) {        new SpringApplicationBuilder()                .parent(BootConfig.class).web(WebApplicationType.NONE)                .child(WebConfig.class)                // 假如有第三个项目,能够作为子容器的兄弟容器加载。                // .sibling(SiblingConfig.class)                .run(args);    }    Configuration    ImportResource({"classpath:spring-cfg.xml"})    ComponentScan(basePackages = "com.diguage.demo.boot")    public static class BootConfig {    }    Configuration    ImportResource({"classpath:web/spring-cfg.xml"})    public static class WebConfig {    }}。
。
Spring Boot 背面是否做了检查,这个是依据报错。信息。的猜想,没有翻看代码,所以这个猜想有必定的不确定性。有时机翻一下代码,检查一下详细原因。

革新没有成功,且听下回分解……。

下文:Spring 运用兼并之路(二):山穷水尽,山穷水尽。

审阅修改 黄宇。

内容来源:https://postapi.nlsngoisaoviet.com/app/app-1/cách hack kim cương free fire,https://chatbotjud-hml.saude.mg.gov.br/app-1/vai-de-bet-entrar

(责任编辑:最新热点)

    系统发生错误

    系统发生错误

    您可以选择 [ 重试 ] [ 返回 ] 或者 [ 回到首页 ]

    [ 错误信息 ]

    页面发生异常错误,系统设置开启调试模式后,刷新本页查看具体错误!