• 0
  • 0
分享
  • 怎么玩好Java组件的配置注入——软件测试圈
  • 恬恬圈 2024-09-12 13:59:39 字数 3016 阅读 225 收藏 0

  一. 前言

  经历过组件多个版本的迭代后,应该会发现,随着工具的不断演进,能搜索到的配置方式可能大多数都过时了,那么如何根据自己的版本快速的找到配置方式呢?

  有时候官方文档里面能给我们正确答案,或者网上正好有对应版本的资料,这些都不在本次的讨论范围内。

  本次思考的就是,如何在缺失这些的情况下快速的进行配置。以MongoDB 来学习一下 。

  二. 解决方式

  2.1  方法一 : 入口类 向下查找

  首先 ,作为工具类的软件,底层可能会有变动,但是对外的接口通常是不会有大的变化的。

  // 在高版本里面  MongoDbFactory 已经过时了 >> 
  @Bean
  public MongoTemplate mongoTemplate(MongoDbFactory mongoDbFactory, MappingMongoConverter converter) {
      MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory, converter);
      mongoTemplate.setReadPreference(ReadPreference.secondaryPreferred());
      return mongoTemplate;
  }

  以上是一个 MongoDB 入口类的配置, MongoDB 只要不发生大的迭代,MongoTemplate 这个入口类是不会有太大的变化。

  但是抄过来后,会马上发现 MongoDbFactory 过时了,这里说明我们已经找到关键点了 :我们需要一个新的 Factory。

1-.jpg

  点开 MongoTemplate 就知道需要一个 MongoDatabaseFactory , 通过实现类就能快速找到我们应该创建哪个类了 :

  xxxBuilder : 好东西 , 通常都是官方提供的配置类,用于帮助创建实例,例如 RestTemplateBuilder,就可以快速创建 RestTemplate。

  xxxFactory : Client的创建类 ,也是比较核心的创建类。

  xxxSupport : 这种通常是最后的支持类,一般都是实际的业务,这种类可配置的点就很局限。

  xxxClient :通常基于这个调用远程组件,一般配置这个Bean就能实现对应的远程调用了。

  xxxConverter : 最常见的就是做数据映射,把DTO的数据转换成组件需要的数据格式。

  Simplexxx : 这个前缀是个很明显提示,说明基础的功能用它就没错了。

  然后再往上找一找,就很容易找到对应 MongoClientSettings 类 ,里面神奇的发现了一个 Builder :

  MongoClientSettings.Builder builder = MongoClientSettings.builder();
  // 设置服务器地址
  builder.applyToClusterSettings(clusterSettingsBuilder ->
          clusterSettingsBuilder.hosts(Arrays.asList(new ServerAddress(localhost, port))));
  // .... 省略
   MongoClientSettings settings = builder.build();
  // 创建MongoClient客户端 , 最后创建一个 Factory
  MongoClient client = MongoClients.create(settings);
  return new SimpleMongoClientDatabaseFactory(client, database);

  2.2  方法二 : 反馈式-针对提供了配置项,但是缺少或者不知道配置的场景

  这种方案在我配置 Sharding 的时候效果非常好,最直接的表现就是,每次启动缺少配置时,都会有相关的反馈。

  org.apache.shardingsphere.infra.exception.ShardingSphereException: Can not route tables for `[t_blog]`, please make sure the tables are in same schema.
      at org.apache.shardingsphere.sharding.route.engine.type.unconfigured.ShardingUnconfiguredTablesRoutingEngine.route

  首先,进代码去找原因 ,这里不难发现第一个线索,没有 tableRule ,导致表名没有正确的分表。

1-1.jpg

  正常情况下,我们不应该进到第三步里面,那么就网上找,为什么我的 rule 不存在。

1-2.jpg

  流程不复杂,通过6步就快速找到了配置类,后续按照配置类进行配置即可,熟练情况下,可能十几分钟就能解决一个配置问题。

  2.3 方法三 : 由下到上 - 针对 Client 对应不上,有微小版本差异的情况

  这种方式和上面的类似,也是找到对应的下层入口,可能这里会有一些模糊,怎么知道下层入口?

  除了报错的反馈式,最好的方式就是直接看最终的源码包,以 ES 为例 :

  第一步 : 找 Jar 包 ,如果是需要调用外部组件的 ,直接看对应的 Client。

1-3.jpg

  但是一般的Client都会做脱Spring处理,这里的东西是没办法直接注入的

  第二步 : 找到对应的 Spring 包。

1-4.jpg

  这里可能会有疑惑,我都找到了 Spring 包,为什么还要找底层,我先走第二步,再往下不就完事了吗?

  以 ES 进行举例就是因为 ES 的变动太频繁了,我们可能只能从ES官方找到对应的 Client 版本,但是不太好去找这个 Client 应该对应哪个 Spring 版本。

  第三步 :参考 Configuration 仿写。

  这个有一定难度,主要在于串通流程。

  这个方法一般只针对具有微小版本差导致跑不起来的情况。

  2.4 方案四 : 弯道超车,直接搜索 AutoConfiguration 类

  一般常用的配置在Spring AutoConfiguration 包中都会有定义,我们可以尝试从这个包中直接进行配置 ,但是这种方案的前提是你的 Configuration 能和对应组件匹配正确。

  当然,通常Spring在写这些配置类的时候,也是基于接口进行的开发,从某种形式上说也是为了避免这类版本偏差大的问题。

  但是你碰到 Elastic 这种小版本 = 大变动的组件,那就没办法了。

  总结

  东西不多,主要是思考和总结。

  感觉没有把那种想法描述清楚 ,还是得靠意会。

  这些年不过是自己写Demo还是做技术调研,都涉及到这种配置不知道咋搞的场景。这些方式也是慢慢摸索出来的,也许也和经验多了有关,但是方法论多多少少还是有点用处的。


作者:AntBlack    

来源:http://www.51testing.com/html/08/n-7796908.html

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •       hr面的话一般来说技术面通过的话,个人没有太大的和公司不符合的问题都能通过;      技术发展类的话这个就完全看自己啦,主要考察的会是你对技术的热爱和学习能力,比如会问一些你是如何学习xxx技术的,或者能表达出你对技术的热爱的地方等等。      实际面试中面试官会根据你的简历去问,比如你的项目多可能就问的项目多一些,或者你说哪里精通可能面试官就多去问你这些。      面试中必考的点且占比非常大的有测试,语言基础和算法。 ...
            0 0 1159
            分享
          • 12月19日消息,美国当地时间周日,推特宣布将禁止用户在其平台上免费推广其他社交媒体,违规者将被要求删除推文,严重者将被封禁账户。今年10月末,在埃隆·马斯克(Elon Musk)斥资440亿美元收购了推特后,许多用户在推特上分享他们的其他社交媒体账户。推特在周日的声明中表示:“我们认识到,我们的许多用户在其他社交媒体平台上都很活跃。然而,我们将不再允许某些社交媒体平台在推特上免费推广。”该公司继续称:“我们将删除仅仅为了推广其他社交平台而创建的账户,以及包含下列平台的链接或用户名的内容,Facebook、Instagram、Mastodon、Truth Social、Tribel、Nostr...
            0 0 1055
            分享
          • 1、引言小屌丝:鱼哥,我想请教一个问题。小鱼:国庆假期你经历了什么,让你变得如此的 "善良"?小屌丝:别这么说,我一直很善良,至少,很正直....小鱼:打住,直接点, 你有什么需要帮助的?小屌丝:我就是想把查询的结果也入到excel表中小鱼:然后呢?小屌丝:sqlserver数据库。小鱼:......好吧,还有其他要求吗?小屌丝:没有了。小鱼:OK,我就花费几分钟,给你整一个。 2、代码实战 2.1 openpyxl写入excel 2.1.1 安装凡是涉及第三方库,必须需要安装,老规矩,直接pip安装pip install ...
            0 0 937
            分享
          •   最近几年,软件测试行业的发展比较迅速。可以从人员的薪资、技术的要求、岗位的细化等方面看出。几年前做功能测试达到熟练程度的,或许可以拿到一个不错的offer。短短3-5年,只会功能测试,找工作都困难。不知不觉中,你在浏览招聘信息时,经常会看到这么一条“熟悉或精通接口测试、自动化测试、渗透测试、APP专项测试中的一项或多项。至少熟练使用一种编程语言或脚本语言”。  这是一个初级测试工程师的招聘信息。同样是招聘功能测试人员,但是现在会在里面加上这么一条。很多人会问,为什么招功能测试,却要在招聘信息里面加上这么一条呢?原因是这样的:公司目前是做功能测试,但日后随着业务的开展,会随时需要用到新的测试...
            3 3 2816
            分享
          • 前言我在CSDN上看到一篇名为《程序员为什么非要参加一场编程竞赛》的文章,这是一篇译文,原著是国外的作者。这让我想起前段时间我参加的一场软件测试比赛,最终的感想可以用8个字概括,人无远虑必有近忧。在这里我想和大家分享我的参赛过程和赛后总结。一、赛事简介比赛给人的第一印象就是激情,热血,因为比赛一定能分出高低。编程竞赛在国内出现的时间比较早,现在已经上规模,成体系了,加之媒体的报道,大家也比较熟悉。但是软件测试比赛或许大家还没听说过。实际上成体系的软件测试比赛,例如CST全国大学生软件测试大赛,在2016年就已经首次举办,今年已经是第四届了。赛事项目分有:单元测试、性能测试、安全测试、web自动...
            2 1 2269
            分享
      • 51testing软件测试圈微信