乐趣区

关于java:不看源码怎么卷的过小年轻

原创:猿天地(微信公众号 ID:cxytiandi),欢送分享,转载请保留出处。

在工作中,我置信很多人都有上面这样的感触:

  • 这谁的代码呀,看不下去了
  • 这破代码,一行正文也没有
  • 这代码,还没我写的好
  • 这代码,有 bug 吧
  • 这代码,。。。。。。。

是不是很实在,咱们往往在看他人代码的时候就会有下面这些想法。我认为次要的起因还是大部分看的都是业务代码,而且很多是多年积攒下来的,也没有重构,而后一年年的堆逻辑,最初就变成 shi 山了。

当然也有不少的人代码写的的确很好,简洁易懂,咱们在看他人代码的时候要抱着学习的态度去看,同样的逻辑,看看他人是怎么写的,为什么这样写,如果是本人会怎么写,比照下,这样的话你就有播种了。

明天想跟大家聊的话题次要是看开源我的项目的源码,因为业务代码大家每天都能看。所以往往只会去用某些框架,而疏忽了它的外在。

多看开源我的项目的源码是很好的学习机会,特地是当你遇到问题的时候,或者想要做一个什么性能的时候,如果有其余框架中也有相似性能,那么你就晓得怎么做了。

案例一

比方我在做一个性能,须要集成多种配置核心,如果依赖了 Nacos 那就用 Nacos,如果依赖了 Apollo,那就用 Apollo。在主动拆卸的类中就要解决这种没有依赖的状况,最开始想的就是这样解决:

@ConditionalOnClass(value = com.alibaba.nacos.api.config.ConfigService.class)
@ConditionalOnMissingClass(value = { "com.alibaba.cloud.nacos.NacosConfigProperties"})
@Bean
public NacosConfigUpdateListener nacosConfigUpdateListener() {return new NacosConfigUpdateListener();
}

而后测试发现,如果在我的项目没有依赖 Nacos 的状况下,这里就会报错,尽管加了判断也不行。这个时候我就再想,其余的一些框架中是如何实现的呢?

这个时候我就想到之前看 Zuul 的源码,外面也有相似的需要。会应用不同的 Client 来进行调用,比方 ApacheHttpClient, OkHttpClient。

发现 Zuul 外面是加了动态类进行判断的,这就不会报错了。如下:

@Configuration
@ConditionalOnClass(value = com.alibaba.nacos.api.config.ConfigService.class)
@ConditionalOnMissingClass(value = { "com.alibaba.cloud.nacos.NacosConfigProperties"})
protected static class NacosConfiguration {
    @Bean
    public NacosConfigUpdateListener nacosConfigUpdateListener() {return new NacosConfigUpdateListener();
    }
}

案例二

当我须要管制 Feign 的调用逻辑,替换调用的 URL 时我就想到之前看过 Sleuth 的源码,Sleuth 做为一款链路跟踪框架,外部对很多框架进行了集成。

像 Feign 这种近程调用的,须要对它进行扩大,而后透传链路跟踪的数据。所以当我也有相似需要的时候,就能够参考 Sleuth 的实现。

下面贴了 Sleuth 中的 TracingFeignClient 源码,TracingFeignClient 就是 Sleuth 中对 Feign Client 的扩大,减少了 Sleuth 本人的一些逻辑。而后这个 TracingFeignClient 最终会在启动的时候替换掉 Feign 默认的 Client。

案例三

当我须要对 Redis 做埋点监控的时候,又想起了之前看过 opentracing 中对 Redis 的监控代码,就能够借鉴外面的形式。

地址:

https://github.com/opentracing-contrib/java-spring-cloud/

外面就是用了 AOP 对 RedisConnectionFactory 和 RedisConnection 进行了替换,也不必动框架底层的代码,扩大就行。

总结

写本文的目标就是为了通知大家,在平时无事的时候除了学习一些框架的应用,也要去翻翻源码。尽管过后不肯定用的到,然而在你当前遇到相似问题的时候,你会有映象说,过后我在某某框架中看到过相似的解决方案,这就是你的常识积攒。

另一个点就是这些框架中都会用到一些好的设计,也是咱们能够学习参考的案例。

最初就是在面试中也有遇到说:有没有看过框架的源码啊之类的问题?

如果真的看过,并且记住了,这个时候你就能够和面试官娓娓而谈,称兄道弟了。

对于作者 :尹吉欢,简略的技术爱好者,《Spring Cloud 微服务 - 全栈技术与案例解析》,《Spring Cloud 微服务 入门 实战与进阶》作者, 公众号 猿天地 发起人。

退出移动版