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

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

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 面试是一个“表达自己”的过程,我们需要在短暂的30到60分钟的时间,将自己的真本事表现出来,让面试官看到自己在这份职位上能产生的价值。我曾遇到很多人,简历背景非常厉害,但是在面试环节却差强人意,原因是什么呢?我想有两种情况,第一种是简历虚假,第二种是不善于表达,面试紧张等各种因素导致未将自己实际的能力表现出来。第一种情况,奉劝大家在做简历时一定要实事求是,HR都不傻,是真是假,是可以聊出来的。第二种情况,是我们今天分享的主要话题。接下来,我会按三个方面给大家分享我根据经验总结出来的干货:面试前的准备、面试中的表现、面试后的追踪。01 面试前的准备在我们收到一家企业的面试邀约并决定要参加面试后,...
            1 0 2050
            分享
          •   巴西最高法院法官亚历山大-德-莫赖斯(Alexandre de Moraes)在周二发布的一项命令中写道,该公司已经满足了"立即恢复在巴西活动的所有必要条件","我命令结束封禁"。  这一授权结束了这位亿万富翁与莫赖斯之间长达数月的争斗,在马斯克藐视巴西法规之后,法官于 8 月底封杀了X。  这相当于这位世界首富的一次重大屈服,他曾将与莫赖斯的冲突作为反对南美国家管制网络内容的言论自由运动。  马斯克关闭了 X 在巴西的办公室,以抗议删除某些资料的命令,据称这些资料对巴西的民主构成威胁。 几天后,最高法院封禁该平台,理由是它没有遵守当地法律,该法律要...
            0 0 271
            分享
          •   产品功能测试与系统测试有什么区别呢?这常常是让测试人员非常迷惑的地方,有的小伙伴认为系统测试应该包含功能测试在内,有的小伙伴则认为这是两个独立的测试类别。而从很多方面来说,产品功能测试与系统测试还是有很大区别的,小编就简单分析一下,两者的相似与不同之处,以及如何做好功能测试?  一、产品功能测试与系统测试分别是什么意思?  产品功能测试是指对软件产品或者程序各项功能进行验证,根据功能测试用例进行逐项检查,看各项功能是否能正常使用,并在此过程中发现软件存在的潜在问题。通常功能测试不考虑系统内部的结构及代码情况,所以也称为黑盒测试。  系统测试是指对产品的硬件软件以及应用场景进行系统的测试,模...
            0 0 1240
            分享
          •   调查问卷福利礼包准备就绪,如果你也想拥有畅销的测试书籍、实用的京东购物卡。那就点击链接参与调查问卷活动吧!机不可失时不再来!链接:http://vote.51testing.com/  大厂喜欢什么样的人才  ·学历  第一个,大厂在学历方面,会刷掉一批人,大家都知道大厂都喜欢到名校去找人,为什么呢,因为名校的话呢,至少是通过重重筛选,就我们中国的应式教育来说,虽然说现在叫素质教育,但是他的本质也还可以叫做应式教育,不断的考试,能够进到这一些重点学校的985/211这一些学校的,那他至少第一个通过了我们的中考高考,然后跟一大批人PK,竞争掉了很多人,素质是比较全面的。  所以说在学历这一块...
            0 0 835
            分享
          •   作为一个测试,最尴尬的莫过于分给你的task,别人做交叉兼容测试的时候,在你负责的内容里找出了很多你没有测试出来的bug。  我也曾因为测试不全被组长在工作群里艾特。说实话,真的恨不得找个地方躲起来。  为了避免自己再次出现类似的情况,我开始写测试笔记。记录负责task中需要测试的内容,然后不断的重复研究测试,这种情况就基本没有了。  复杂的测试笔记,我写了有两年,后来慢慢发现好多东西都是相通的。于是,我整理了一个做测试的模板,每次新分配给我task时,我都按我自己的模板测试。  我做的工作是黑盒测试,基本属于纯黑盒。测试的有web端,android手机端和ios手机端,偶尔也会测试手机带...
            0 0 746
            分享
      • 51testing软件测试圈微信