diff --git a/docs/nice-article/weixin/ztpxspringaopymxbjrynkddsqsxwdxg.md b/docs/nice-article/weixin/ztpxspringaopymxbjrynkddsqsxwdxg.md index e5ab46ebfd6c47c641874706b1ba703675089e3a..831ff9ad41aacacd37f8715220cdd63f5b2d1a9a 100644 --- a/docs/nice-article/weixin/ztpxspringaopymxbjrynkddsqsxwdxg.md +++ b/docs/nice-article/weixin/ztpxspringaopymxbjrynkddsqsxwdxg.md @@ -10,7 +10,7 @@ head: 下面我会简单介绍一下 AOP 的基础知识,以及使用方法,然后直接对源码进行拆解。不 BB,上文章目录。 -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXB5DpIX5wdfCo7yOtuptf4soEyibRiadk2vNTE3osLicX8ASHlQ25Z1YYA/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-47fdcb84-4294-416f-b95e-9d9bd427717b.jpg) ## 1\. 基础知识 @@ -124,7 +124,7 @@ public class MyTest { 整个 Spring AOP 源码,其实分为 3 块,我们会结合上面的示例,给大家进行讲解。 -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXMLw1cktM3ZpZ9zy1Jw5VrSVX5PKpt8audbKzrmun22v4FRdRRoEeCg/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-b7bd6ce5-0cec-4f31-8bbf-d4ea8a5e7507.jpg) 第一块就是**前置处理**,我们在创建 Louzai Bean 的前置处理中,会遍历程序所有的切面信息,然后**将切面信息保存在缓存中**,比如示例中 LouzaiAspect 的所有切面信息。 @@ -133,7 +133,7 @@ public class MyTest { * **获取 Louzai 的切面方法**:首先会从缓存中拿到所有的切面信息,和 Louzai 的所有方法进行匹配,然后找到 Louzai 所有需要进行 AOP 的方法。 * **创建 AOP 代理对象**:结合 Louzai 需要进行 AOP 的方法,选择 Cglib 或 JDK,创建 AOP 代理对象。 -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXZYMGUKSqUIK8nYQlE0Q1lUg4XBoO2ZZGO47mrYTBHeFWZBwbbbuYpg/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-b339dde2-e0aa-4554-a6d0-d9ecc46248b5.jpg) 第三块就是**执行切面**,通过“责任链 + 递归”,去执行切面。 @@ -145,37 +145,37 @@ public class MyTest { ### 2.1 代码入口 -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXLWvEvO4DDw5hpbeHpibibiaxQNM2K5gnQlZSKJP07icjzPzrzTFvr55qGA/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-e5f3f404-beb8-49c1-ad70-0b1352480113.jpg) -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXg0UmpYyR0GCibSjuMNpTC7FyLkqIPWXibv9bNHevyNOFrJQ86tjJslZA/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-b65fb6b6-dea7-45e2-96ad-e2e83430072e.jpg) 这里需要多跑几次,把前面的 beanName 跳过去,只看 louzai。 -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXnWXQeIaR9QajdITQibKuYQmk020Rlth3XmMHvZY86iawibnEJBmtj6JIQ/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-1e29c65c-e0b1-4d27-8d9a-920940087d62.jpg) -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXAtS26F8ZSePx2De4aROVePWrrAOYRo4iaXb8pFGUNDSU1Fvh6vL8m7Q/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-d33887ee-fa82-4f95-9d96-7e477b056d28.jpg) 进入 doGetBean(),进入创建 Bean 的逻辑。 -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgX06ov3kiaLZYCB8tgbRUza9ZibiavQRwBylgKEkF52HC3NxAge4QWjmlsQ/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-da9819ba-ae1f-4748-9e37-ae367c6708fd.jpg) ### 2.2 前置处理 -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXL2PD0YfIuXWEYiaqIicJibicJ41I6BHZNqJ8c3nlyxaS5Aibj8r1GRicXDdg/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-4d65b97e-829a-4b6a-a344-f4e4bd2aa7df.jpg) 主要就是遍历切面,放入缓存。 -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXTbYRFtnMpBianDgwico6jJG9BjfWKos5ctLmQPTFepmhbaeuLkVG9KlA/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-caf81351-a499-4b88-bd74-455333d4d9aa.jpg) -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXPQAM7x2Q7iavbMuAOsKtFRbXqGibGgdia6mpPbUY8xtcY9OiaLQDZIjcxg/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-91248113-54bd-4532-a639-5f64248e362a.jpg) -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXAcmHlZib4QHs27ibsNh5I26R9zTgBwOtDIH5TGhwyhr5d40JH1U3iaHqA/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-5b677522-3760-4cfb-956b-27af3b811227.jpg) -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXtWhZOJHG1U4ODKEgN5Lj1ytfME9CK41SI6GsBFJFE5SwuXl2BFicTrQ/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-92b096f5-4132-4448-bafe-3220393762bf.jpg) -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXhCnibnyKkw6oqHQw1Zk2icLT4pfSs43eRV26ICUIt2e8VpFiaEUbmLgcw/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-1d2fb3b6-77e4-4052-ad2f-b269573f126e.jpg) -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXLrlQudpfcVzVfficVL1iarSmeib4MubP8ibebpG6ibtghYBCDSAKS8Ymoxw/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-a4aacebb-e56a-4387-b717-13bef97ccb99.jpg) **这里是重点!敲黑板!!!** @@ -184,7 +184,7 @@ public class MyTest { 3. 获取每个 Aspect 的切面列表; 4. 保存 Aspect 的切面列表到缓存 advisorsCache 中。 -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXtfeRFaqM1VaSxH4UDSCI7wwOl1NAcMg6u9zxTXyAMicqL8LJMg1J58w/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-9e382893-619c-493d-ae29-4a55bd7eb9f7.jpg) 到这里,获取切面信息的流程就结束了,**因为后续对切面数据的获取,都是从缓存 advisorsCache 中拿到。** @@ -194,112 +194,112 @@ public class MyTest { 上图的第 2 步,逻辑如下: -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXEKetmAuX6Id6emNMU1nzBOAgssjQUVPhuXK2W9Op537SrzibIDaGpnw/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-0ac0dfa8-2ab2-4fd6-90fe-969249a38387.jpg) ### 2.2.2 获取切面列表 -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgX0bxofHQAI1D0HfZptwaAbRYib3oa8o7Y4yPSdOLdrsOMmCweXodYFfg/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-705ec3d5-41c0-4321-a1bf-6dbcfc0a8f62.jpg) -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXAke9iaXXBEE7H2F1JPpLRD4nqHhOXyQSiboxGiaic07evLiaH7ASgxewGnw/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-aeb8a9c9-2776-4833-8c92-bfa8e04cd3e4.jpg) -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXCfPwrCyoGatkgfAEXY2mgrj45dSN45xk5tmSib0x5I6mg8jKPwLnoOg/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-b8e444fc-643d-42a4-adb2-8228a4c644b0.jpg) -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXEdtNy0ib7dkoXiabnkGb0vl87KElQnxQ3oaiczEfZgtmhusB4WqvfbwaA/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-e78eca5d-653a-4441-8cf9-6928131c0d14.jpg) 进入到 getAdvice(),生成切面信息。 -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXe2wBloKlC7KZ2IS52ql61q4G7iafluzcfFevkUO6DpjXsT2Z985Jjvg/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-4d9de4a5-894b-4b97-a7e0-80bd996db8bc.jpg) ### 2.3 后置处理 -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXoN50ic2sd7IQUvtmQ7xAEYXdxZPUCPuZElUyzlic8oeBNtBjRY6ctDJw/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-d47f0eb7-131d-4ff9-94d7-a6a2af5046bb.jpg) 主要就是从缓存拿切面,和 louzai 的方法匹配,并创建 AOP 代理对象。 -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXqOn0gbza0BOEEZNuHia76DBHicXIX33lxyuNGCYlld2EeBJObicYjiaN3A/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-4eeadb6c-53b7-4328-9444-d5936e2a38c0.jpg) 进入 doCreateBean(),走下面逻辑。 -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXzAa6uXQpcA7HKr1zoopjjogMqqy6mDpicFXwnRAnTJzyIOBHUDN1OJQ/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-bfccf30a-f56e-431e-a51c-45e63c312b3f.jpg) -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXrfBemrVibHTPmibsTU6HjSWr7bBtDibb3Htt5ZAJtYztmbyvIGPzmGllA/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-2b730853-42ea-4bc0-a5be-455eb9e0da48.jpg) -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXX84QzReAlrENeR8605C9gvEL0FlJRTHryawI8LsLkm7QsnaxdUGibVA/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-db0b89d3-f370-4725-bb87-4c66a7387dbe.jpg) -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXxBpPqpPgBgAoVBLXYFFTzfehEt84A8FHG9437g70b72hpDLr75V7SA/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-7b8c3321-e6d4-4462-b6f5-b10e7cb1108b.jpg) **这里是重点!敲黑板!!!** 1. 先获取 louzai 类的所有切面列表; 2. 创建一个 AOP 的代理对象。 -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgX7RBZleHVJNda7T3TJNSzAfx2ZDxOJiclb5Wqj4R9rZDfO1RMYAAmN4g/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-fe58ed47-bffe-4d48-a574-5a3c56450587.jpg) #### 2.3.1 获取切面 我们先进入第一步,看是如何获取 louzai 的切面列表。 -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXRPRvz2gTdQkGuhsxxHlnQa287yUtrbgXpiboE6m7RrNLXJQPx9uNjLg/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-2a73d781-cdc3-4212-932a-c6f3ac1d455c.jpg) -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXWpyNjcEblMQz77snp3z9vewRRArCjxxVYnXj1XIZia73b5GECzCYdkw/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-ee619aa4-647c-423f-921c-063d22af5bde.jpg) -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXZss42L48ibuLvT7P7Ec3r183WT2aVcEKTE9eAtAP9XdhJZQ6pOcib0iag/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-c0ecc5fd-be1f-41c9-a7f6-06691774ff69.jpg) 进入 buildAspectJAdvisors(),这个方法应该有印象,就是前面将切面信息放入缓存 advisorsCache 中,现在这里就是要获取缓存。 -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgX4bJ7cQDQH3ibqiaJCye7keOewzZUmkv9s4MYPGCBuGSEUswhslleqKUw/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-363a27c9-f1e7-4c95-be4e-cafbf0feb76f.jpg) -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXnpQfRYFc6sr4ldf3cqqVt4SKGMnpibVzq99HUAGSnlqj3ur5gq4bxPA/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-5a30626f-28da-494b-b8c1-d0bb8025fe7d.jpg) 再回到 findEligibleAdvisors(),从缓存拿到所有的切面信息后,继续往后执行。 -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXkUianicWAnd8wfe4ia8n3FCh6HicJn2T9Z38LsoY0CXLn9pTb7Uib461bqQ/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-812a9c92-03af-49a9-8833-3f618ebda928.jpg) -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXWnoDfJLf3Udia568cLLdXGIPqbbEL970dABB7Yx15krucibBbjiaVN35w/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-50b074de-062e-47a7-aafe-51243283b865.jpg) -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXuJxFeu1NicMrophoQIbXJa6ric2jVH9IJjVCBdcy9Y9nQ0vBzj7iaPFDQ/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-41ad57c1-636f-495d-b928-3c2cc284d749.jpg) -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXzD6BkO2NAoNjEibDwbs84xAMI2Lm0FMfv30l11UJOEnyrH5YyUoyKuQ/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-9dedc4e9-6434-4b79-ab6d-5a0600daa45b.jpg) -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXszRcBmQ4f9FEnRrgKPZMfI5PzeSFdodoJhuqNfI8vFHL2ibzgpMc8LA/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-ae188ad2-d81f-497b-8fd1-8f8e09c06239.jpg) #### 2.3.2 创建代理对象 有了 louzai 的切面列表,后面就可以开始去创建 AOP 代理对象。 -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXHz46t9AR7Xj20NACWzgrGAt829NeNsdxtBATKgkxWI7jdFSo5Tvd4Q/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-b508394c-62c2-41a5-a724-6c94de7f8aaa.jpg) -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXTx2X6eHfcjY4UDXKwl4qgJZq8iblTgzcFOlbA6MicEH9fy8CYt7aWK9A/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-526f31e0-7ada-4575-90fb-354bb05a1596.jpg) -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXsAVALC1Xic0ibqD5oA1jYLUFvjIiaB4ZaRK0lvOg3M0YGN6fdjSfnoHfg/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-efa7ea29-7429-4036-af59-76222fba45f1.jpg) **这里是重点!敲黑板!!!** 这里有 2 种创建 AOP 代理对象的方式,我们是选用 Cglib 来创建。 -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXD1R0UAR5CjbADYEBiaUpHkBD0IlvH0vX8XGAMOnm0kpo0VmBGlD749A/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-8a18e8e2-b5c3-4834-90ee-4622dc31a462.jpg) -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXnGnVGJ135yMaMgicyCtzxiaiaNjwef2HzJ9ZnwDbxqKU35I2OIcQQVJNg/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-2a3236c2-5bc9-462f-a4de-8e580dd3d8a9.jpg) -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXTNvnqKQgG7mrZrI4QWbMoIYia1DicmPZ0lkMCUibcmg8kryYicCe7ooG7Q/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-3bf40134-ca93-4356-ace7-a52974a6080b.jpg) 我们再回到创建代理对象的入口,看看创建的代理对象。 -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXvTZG36YI6J77NcJJOzmNdmIsVmsKz9IDKNE5HXb17zDCibg4G5gkb1Q/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-0134f49f-987a-42b1-a557-b3e9cb306875.jpg) ### 2.4 切面执行 -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXoa2fdcCEzA7E8UaoFvY5xzQsokAWM4hZq9AChp8qZ4AvatJ3se7Q3g/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-e75bd59f-2f95-4dfb-b16c-c3f4533767d1.jpg) 通过 “责任链 + 递归”,执行切面和方法。 -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXlQa3Ik2ibN9p2HzJoD5uPnrqMfv39vXp8UibIPg8D4rF5fQlrgZI2uQg/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-2710f079-ac57-4e4b-a70f-8814d0f5bafb.jpg) -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXGUaCZjSy03s4kTI7leJpvibtB2ILibKjiae3L2JUP8sicwmiaTia9PiaKDPmA/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-e3c0d53f-c7d2-4110-b44a-7d14465e120a.jpg) **前方高能!这块逻辑非常复杂!!!** -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgX8MGs3uHzSmptWm1VEgkwuSzMeCZvAGWFTjXrHm2LblxDOxh5dTSDrw/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-e8b2d21b-c8ca-488a-bf99-fab5fe131004.jpg) 下面就是“执行切面”最核心的逻辑,简单说一下设计思路: @@ -308,7 +308,7 @@ public class MyTest { 3. **退出递归条件**:interceptorsAndDynamicMethodMatchers 数组中的对象,全部执行完毕; 4. **责任链**:示例中的责任链,是个长度为 3 的数组,每次取其中一个数组对象,然后去执行对象的 invoke()。 -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXPCcBzSWf43F20rOK1IicpFbN1JbwxPssiccuRFbIAicI7ibbORlRLjbjJw/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-df18226b-3c94-42bb-adb2-9e381c5c8c21.jpg) 因为我们数组里面只有 3 个对象,所以只会递归 3 次,下面就看这 3 次是如何递归,责任链是如何执行的,设计得很巧妙! @@ -316,61 +316,61 @@ public class MyTest { 数组的第一个对象是 ExposeInvocationInterceptor,执行 invoke(),**注意入参是 CglibMethodInvocation。** -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgX2IbVCpF30CrlKxicKiajeGUdvF7vCS1q60bpc57MIATWgqyomofiaBagA/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-407ed9d8-c9cc-43d0-9e86-71eeb50bf728.jpg) 里面啥都没干,继续执行 CglibMethodInvocation 的 process()。 -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgX6QHIWdGHqfInlKOicc9r65xysIXs4bgd1GyP24J7boictGyWXyjibsgkQ/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-6b7b45fa-510e-44fb-b81f-88589900636c.jpg) -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXSOJmBdA7YkITJepHMoLibm2U1CkhuZNCa0A2dfxNwWcHWG5x2RQelZQ/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-d66c5cac-d648-428a-a344-20dfd511c3bc.jpg) #### 2.4.2 第二次递归 数组的第二个对象是 MethodBeforeAdviceInterceptor,执行 invoke()。 -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgX9GLD6g9jEEeGrZuDhqnHCsW6MMfLSDFILb6wB1wsegkKKGZbwleLMA/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-6f35aed5-a725-41a2-96ee-bfcb481abd03.jpg) -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXLdS4S0kkQy1eN9uS8cCcTdXUEa4aZia7Biaq08QT0BK4Khko8RoH2RSA/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-0ab482cf-cf10-4e48-8880-fda1cdc5d91b.jpg) -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXmjS6xsnV0PPR8jYpWVfTCFiaic1rW6wZ3XhyFTRgVCkorK41tJeOIl5Q/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-35eec321-2e43-451a-8b22-0e00695985b9.jpg) -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXCJywozWpKyhsNq3iaMDcS8F5IYS7iaEIoKcvUdXdA7k9VlPNPlBHpOCw/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-df43ae49-c73e-459a-b09b-4009624baf92.jpg) -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXebA3iapPwJIZNhYmu6xevdp3icMGVbbYVO1iaK3Q1icicNoA9pU9uibEsjDA/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-b15f48b0-ee63-4f23-bf0c-98e14d18bdaa.jpg) -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXicogqOjgtK0RpO7gaZJicDTmhqibyRAN64Bjol5iaQakK7vSDsHFiaDVORA/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-a6900293-7500-4b5c-bd48-1e77c6b5c260.jpg) -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXkPz6zRAVFcfOP7tSgCCkSLwH3GZ5Xqu5owhKbjmkgvQoy9UzVGhYTg/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-ed54f377-1de9-4d0e-94fe-2ad36470ef33.jpg) -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXXwHHGu6WI1yqarB0BlI3YSz9ibKYmicAwyHFcYMAjPe0pgfwuCZ9IpLw/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-ce217e8b-4c11-4edf-99c8-85ad011eede8.jpg) -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXbZMIMkUHXCPdqCb9AYTXvIc0cxLRS9dkCbbM5IW91sdHxULDvotQqg/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-85514d47-ce74-4842-9f54-f35b363942a6.jpg) #### 2.4.3 第三次递归 数组的第二个对象是 AfterReturningAdviceInterceptor,执行 invoke()。 -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXDibiaWWnaD0qiaR0W5xloBTag0sgnIVQQaRSibGe66Gq9tXsibVByoMkwRQ/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-40fe18f2-e199-4ebc-a269-8a1c11326f96.jpg) -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXc8n4VTq3KpXzbZemp6y859syJZaGLvLsjd3x1SSa2WLDvx9MbbkIiaw/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-ad21eda6-e867-4f42-8834-ab9a4282396f.jpg) -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXUYYy4uZNvXwiajRzXWI5EFAQDm8ArvoBAVzzQxUhNu6cNWZvmg3jyiaA/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-0bf4d91c-2198-4bfe-9945-b00f8d736a00.jpg) 执行完上面逻辑,就会退出递归,我们看看 invokeJoinpoint() 的执行逻辑,其实就是执行主方法。 -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXQT5Tr1q2HO2KfRSvwD2cOpIRhBuib6gIwUfYj5WKsPgYFUBgA1pypVQ/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-9c2f1045-2449-4fa9-b579-b113b94d9870.jpg) -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXHsShkQvMejnSUuqfFVpT3knC9ia7RFu6pzHhibNBB5JFKwBw8L7nR0vA/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-a68777fb-36e2-4681-9fd5-b7db7414d1c8.jpg) -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXickQvloYQDr8xU3OTV1zibdylDgqdibUVRHmXTQV7M5qs3Lw4giaD6T9uA/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-78fedc8b-4ed3-4580-9077-867ee8f898d2.jpg) 再回到第三次递归的入口,继续执行后面的切面。 -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXJuvXiahNtMxJUuXqFktOMbMFecq2icGwPH5RauGuNpK9fRfev5ibmUORw/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-8dba29ac-391e-4370-8709-7c92679f4d3f.jpg) 切面执行逻辑,前面已经演示过,直接看执行方法。 -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXAgHxG0CgE6vfNH9ibwNyarjYhzibMoLVJQdGQcic6BcjqZ7VFS0HicPoug/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-c97a08e2-7016-4292-be4d-de057147e320.jpg) 后面就依次退出递归,整个流程结束。 @@ -392,7 +392,7 @@ ReflectiveMethodInvocation 中的 process() 方法,里面有个长度为 3 的 **注意!!!这 3 个对象,都是继承 MethodInterceptor 接口。** -![](https://mmbiz.qpic.cn/mmbiz_png/sXFqMxQoVLHXVoKO8o3pDpp4GTDPvAgXzwThDnpLUZnGIWelavPib0TyTTUkWeVYByxqWQMJsah3aGQ0AicxJHmw/640?wx_fmt=png) +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-3b071b5a-df2a-4afb-b80e-17c2edf7a6e2.jpg) 然后每次执行 invoke() 时,里面都会去执行 CglibMethodInvocation 的 process()。 @@ -448,4 +448,4 @@ ReflectiveMethodInvocation 中的 process() 方法,里面有个长度为 3 的 -![](https://files.mdnice.com/user/3903/b7e50cf4-6fca-4511-9bfd-aa1ed9eb587b.png) \ No newline at end of file +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-521e3b18-010d-47df-a22a-9922bdb7ccae.png) \ No newline at end of file diff --git a/docs/nice-article/zhihu/weilxhdmnjclnxhxg.md b/docs/nice-article/zhihu/weilxhdmnjclnxhxg.md new file mode 100644 index 0000000000000000000000000000000000000000..6f471be042db5384ad4f106f2381b637c402e92d --- /dev/null +++ b/docs/nice-article/zhihu/weilxhdmnjclnxhxg.md @@ -0,0 +1,142 @@ +--- +title: 如何快速提升你的编码能力? +shortTitle: 如何快速提升你的编码能力? +description: 4年了,我一直坚持“抄袭”别人的代码,有时“抄”同事的,有时“抄”框架的,偶尔也“抄”网友的。为什… +tags: + - 优质文章 +author: 知乎用户 +category: + - 知乎 +head: + - - meta + - name: keywords + content: 前端开发,程序员,Python,SQL,Java +--- + +开门见山地说吧! + +十多年了,我一直坚持“抄”别人的代码,有时“抄”同事的,有时“抄”框架的,偶尔也“抄”网友的,这种“抄”的习惯让我的编码能力有了质的飞跃。 + +## 为什么要抄? + +“抄”这个词可能听起来没那么高雅,换个高级点的:造轮子。 + +不是已经有 Spring 了吗?不是有 hutool 工具包了吗?直接搬过来用不香吗? + +**但我仍然鼓励大家在自己可控范围内尝试造轮子,因为造轮子对你的成长是巨大的。** + +造轮子并不简单,它往往会用到很多高级的知识点和技巧。以 Java 为例,如果你要造一个 Mini-MyBatis-Plus,你起码要懂得: + +- JDBC +- 反射 +- 泛型 +- 注解 +- 动态代理 +- 函数式编程 +- 策略模式 +- 模板方法模式 +- .... + +这样一来,为了造出这样一个稍微像样点的轮子,你必须强迫自己搞懂这些高级知识点,并且结合自己的需求灵活运用。 + +最后,轮子造完跑起来以后,一定会遇到各种问题,解决问题的过程中你又得到了成长。 + +提高编码能力的方法,说穿了就一个字:抄、抄,还是 TMD 的 抄!其实绝大多数程序员在绝大多时候都是在抄别人的代码,只不过潜意识觉得自己在原创罢了。 + +## 怎么抄? + +那么,怎么“抄”才是有效的呢?**必须结合自己的实际需求,做好“本土化”。来造一个 RetryUtil 吧!** + +### 发现问题 + +有一天,我发现项目中有一个接口很不稳定,时不时就会调用失败。经过排查,发现它调用了一个第三方 SDK,但由于第三方接口不是很稳定,偶尔会出现网络错误。我想,这很简单,直接 for 循环多调用几次就行了: + +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/zhihu-weilxhdmnjclnxhxg-70173f4d-6904-4bb3-84c7-0722825c0160.jpg) + +正当我准备改代码时,职业习惯促使我 ctrl+shift+f 全局搜了一下,发现已经有好几处类似的代码了。于是,我认为应该做一下方法抽取。 + +### 整理需求 + +但是把好几处类似的代码摆在一起对比后,我犯愁了: + +- 有些方法**有返回值**、有些方法**没有返回值** +- 有些方法抛异常时重试 +- 有些方法内部捕获了异常,通过判断 Result.isSuccess()判断是否重试 + +于是,我觉得还是算了,看看有没有现成的工具吧。 + +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/zhihu-weilxhdmnjclnxhxg-25fdbf74-e133-4bd6-92fe-94324f759dce.jpg) + +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/zhihu-weilxhdmnjclnxhxg-1ba20865-0653-4c6b-a44e-7acf27753bae.jpg) + +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/zhihu-weilxhdmnjclnxhxg-f5cd1f28-dbf4-4ff0-b89a-a2f30286b862.jpg) + +卧槽,这什么玩意啊,这么复杂。我的需求其实很简单,不需要这么复杂的 API,我还是努力一下自己封装一个好了。 + +### 先做一个粗糙的轮子 + +首先,我确定了要用函数式接口+泛型。使用泛型是看重它的代码模板能力,比如重试的代码中都有个 for 循环,就可以**抽取为模板**。函数式接口可以很方便地**把代码中变化的部分和稳定的部分剥离开**,比如需要重试的方法都是不同的,可以通过函数式接口剥离出去。 + +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/zhihu-weilxhdmnjclnxhxg-21501f9f-9222-442a-a9bb-64cf21d59d75.jpg) + +嗯,看起来还不赖嘛,有点大家风范。哦,忘了兼容没有返回值的方法了,加一个: + +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/zhihu-weilxhdmnjclnxhxg-e13e425b-2b22-4b84-b64a-44d1d74a0887.jpg) + +目前 RetryUtil 还存在比较多的问题。 + +### 加入重试次数、时间间隔 + +比如,它的重试并没有时间间隔,**一旦失败立即重试,很大概率还是失败,**甚至给下游造成更大负担。看看别人怎么处理的,比如 Guava: + +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/zhihu-weilxhdmnjclnxhxg-872744dc-d29f-41be-90f5-85f9c8ffde05.jpg) + +很好,“抄”过来: + +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/zhihu-weilxhdmnjclnxhxg-640a45e5-f68a-40ca-9490-a419a82e12ce.jpg) + +### 加入异常处理 + +又比如,最后一次重试仍旧失败时,我们如果还想捕获异常呢?由于目前工具里直接写死了 throw e,我们只能在外部捕获: + +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/zhihu-weilxhdmnjclnxhxg-c3e327e3-dab9-4078-8439-de67aab4f503.jpg) + +我想要优雅一点,风格统一些: + +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/zhihu-weilxhdmnjclnxhxg-39f55c2d-fac6-4f26-bede-5ddfd9e3e931.jpg) + +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/zhihu-weilxhdmnjclnxhxg-58f90b6f-d277-49a8-a40b-76cbd1dfd3eb.jpg) + +在里面顺便处理异常。 + +### 允许结果重试 + +最后一个问题,现在代码里很多重试的地方并不会抛异常,而我们上面的重试都是依赖于抛异常,只有抛异常才会重试!如果不抛异常,怎么指定重试规则呢? + +学一下 Guava 的: + +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/zhihu-weilxhdmnjclnxhxg-70fb43d2-276d-4386-b2f1-11341435492a.jpg) + +好, 继续“抄”(结果重试只针对有返回值的,上面演示的都是没返回值的方法): + +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/zhihu-weilxhdmnjclnxhxg-16bb1fd8-d124-4119-874c-190e9e1eeb30.jpg) + +### 引入 Builder,简化使用 + +最后,都抄到这了,不如把人家 Builder 模式也抄过来吧。倒不是说 Builder 模式好,毕竟本身一个 Util 能做的,原则上不需要 Builder 额外创建对象浪费内存。但我们上面这个方法,参数太多了!在实际项目中用起来可能会比较臃肿: + +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/zhihu-weilxhdmnjclnxhxg-f9b0fcda-fe3f-4538-8b58-226c96d7d96e.jpg) + +改造成 Builder: + +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/zhihu-weilxhdmnjclnxhxg-799f8cb1-cac7-4dde-88fd-ddee95682ddb.jpg) + +## 最后 + +好,写到这我突然发现,一开始百度时看到的是 Spring-Retry,太复杂了,但 Guava 的其实蛮好用的,那就直接用 Guava 的吧。 + +虽然最终没用上自己的 RetryUtil,但我已经具备造出 Guava-Retry 的能力了。生活中很多时候是这样的,群里一个 BUG 跑出来,虽然你也努力了很久,甚至你也发现问题所在,但同事已经解决了。但不必沮丧,你已经收获了很多。 + +祝大家周末遇快~ + +> 参考链接:[https://www.zhihu.com/question/535244045/answer/2563968996](https://www.zhihu.com/question/535244045/answer/2563968996),整理:沉默王二 diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-0134f49f-987a-42b1-a557-b3e9cb306875.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-0134f49f-987a-42b1-a557-b3e9cb306875.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ced8fd22b287e1e47827c836ca1d267fe7520be9 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-0134f49f-987a-42b1-a557-b3e9cb306875.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-0ab482cf-cf10-4e48-8880-fda1cdc5d91b.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-0ab482cf-cf10-4e48-8880-fda1cdc5d91b.jpg new file mode 100644 index 0000000000000000000000000000000000000000..47ff3952a2c8ff70261cf840363c7cad59213c87 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-0ab482cf-cf10-4e48-8880-fda1cdc5d91b.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-0ac0dfa8-2ab2-4fd6-90fe-969249a38387.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-0ac0dfa8-2ab2-4fd6-90fe-969249a38387.jpg new file mode 100644 index 0000000000000000000000000000000000000000..45a733b9180b03405e7dda90cb9154187af85075 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-0ac0dfa8-2ab2-4fd6-90fe-969249a38387.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-0bf4d91c-2198-4bfe-9945-b00f8d736a00.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-0bf4d91c-2198-4bfe-9945-b00f8d736a00.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7504674e905a3b3e460b8b6a407f8019a93f2e56 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-0bf4d91c-2198-4bfe-9945-b00f8d736a00.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-1d2fb3b6-77e4-4052-ad2f-b269573f126e.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-1d2fb3b6-77e4-4052-ad2f-b269573f126e.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c8a7c0b7a7cbbfa3c8b15d4d51375a6f236f66bf Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-1d2fb3b6-77e4-4052-ad2f-b269573f126e.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-1e29c65c-e0b1-4d27-8d9a-920940087d62.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-1e29c65c-e0b1-4d27-8d9a-920940087d62.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cba50d817b8bb2842ca4baa94866c2ab90f08c56 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-1e29c65c-e0b1-4d27-8d9a-920940087d62.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-2710f079-ac57-4e4b-a70f-8814d0f5bafb.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-2710f079-ac57-4e4b-a70f-8814d0f5bafb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e5875c0e579f889d1c8ee5fa94c1e1a79343ec32 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-2710f079-ac57-4e4b-a70f-8814d0f5bafb.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-2a3236c2-5bc9-462f-a4de-8e580dd3d8a9.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-2a3236c2-5bc9-462f-a4de-8e580dd3d8a9.jpg new file mode 100644 index 0000000000000000000000000000000000000000..049eef74b711e655d8877bcf913036e7f68bc536 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-2a3236c2-5bc9-462f-a4de-8e580dd3d8a9.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-2a73d781-cdc3-4212-932a-c6f3ac1d455c.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-2a73d781-cdc3-4212-932a-c6f3ac1d455c.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f7b07b46369a0992b0ac157e0beb80923381a6dc Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-2a73d781-cdc3-4212-932a-c6f3ac1d455c.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-2b730853-42ea-4bc0-a5be-455eb9e0da48.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-2b730853-42ea-4bc0-a5be-455eb9e0da48.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8e476eb962e3f4bed3dbb672e75e038127e1e135 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-2b730853-42ea-4bc0-a5be-455eb9e0da48.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-35eec321-2e43-451a-8b22-0e00695985b9.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-35eec321-2e43-451a-8b22-0e00695985b9.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1a3ed7e58d441dbf8aa52c703da1184a164055c2 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-35eec321-2e43-451a-8b22-0e00695985b9.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-363a27c9-f1e7-4c95-be4e-cafbf0feb76f.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-363a27c9-f1e7-4c95-be4e-cafbf0feb76f.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ac3840ec4d236e990ac485f750170ca1a1b4ab29 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-363a27c9-f1e7-4c95-be4e-cafbf0feb76f.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-3b071b5a-df2a-4afb-b80e-17c2edf7a6e2.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-3b071b5a-df2a-4afb-b80e-17c2edf7a6e2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fef5a46295f4ca8733d98a8b23c4af1d033211b5 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-3b071b5a-df2a-4afb-b80e-17c2edf7a6e2.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-3bf40134-ca93-4356-ace7-a52974a6080b.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-3bf40134-ca93-4356-ace7-a52974a6080b.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8a13d6b003e2b76722b4665af671f771ce7ee34a Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-3bf40134-ca93-4356-ace7-a52974a6080b.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-407ed9d8-c9cc-43d0-9e86-71eeb50bf728.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-407ed9d8-c9cc-43d0-9e86-71eeb50bf728.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1efcc5e4b0ff86ace7fa102963d1acf8140cf40e Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-407ed9d8-c9cc-43d0-9e86-71eeb50bf728.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-40fe18f2-e199-4ebc-a269-8a1c11326f96.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-40fe18f2-e199-4ebc-a269-8a1c11326f96.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7245ec97ba4da19deab437ba63bf7afb89d9c864 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-40fe18f2-e199-4ebc-a269-8a1c11326f96.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-41ad57c1-636f-495d-b928-3c2cc284d749.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-41ad57c1-636f-495d-b928-3c2cc284d749.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1873324348c1a9a901f6d3bc9b08363441777d35 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-41ad57c1-636f-495d-b928-3c2cc284d749.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-47fdcb84-4294-416f-b95e-9d9bd427717b.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-47fdcb84-4294-416f-b95e-9d9bd427717b.jpg new file mode 100644 index 0000000000000000000000000000000000000000..476556eec39dedf914704d516b36530953fdecb5 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-47fdcb84-4294-416f-b95e-9d9bd427717b.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-4d65b97e-829a-4b6a-a344-f4e4bd2aa7df.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-4d65b97e-829a-4b6a-a344-f4e4bd2aa7df.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f34c9b697a687f74785e2d86f9b787fa55d643b0 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-4d65b97e-829a-4b6a-a344-f4e4bd2aa7df.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-4d9de4a5-894b-4b97-a7e0-80bd996db8bc.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-4d9de4a5-894b-4b97-a7e0-80bd996db8bc.jpg new file mode 100644 index 0000000000000000000000000000000000000000..28b13752a9fac87199172b7bfb6ad3df1036a16f Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-4d9de4a5-894b-4b97-a7e0-80bd996db8bc.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-4eeadb6c-53b7-4328-9444-d5936e2a38c0.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-4eeadb6c-53b7-4328-9444-d5936e2a38c0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d0a401a17e2a72be3fa6f404ccde91afb04e4ea3 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-4eeadb6c-53b7-4328-9444-d5936e2a38c0.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-50b074de-062e-47a7-aafe-51243283b865.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-50b074de-062e-47a7-aafe-51243283b865.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1364536877e1505909ec3e3a31eeb1084c473707 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-50b074de-062e-47a7-aafe-51243283b865.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-521e3b18-010d-47df-a22a-9922bdb7ccae.png b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-521e3b18-010d-47df-a22a-9922bdb7ccae.png new file mode 100644 index 0000000000000000000000000000000000000000..1f379e2d3d8887888a3e18d7b05a541d34deaa4a Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-521e3b18-010d-47df-a22a-9922bdb7ccae.png differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-526f31e0-7ada-4575-90fb-354bb05a1596.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-526f31e0-7ada-4575-90fb-354bb05a1596.jpg new file mode 100644 index 0000000000000000000000000000000000000000..28c296a5d58e944ffd477e1ca23697455f538c3e Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-526f31e0-7ada-4575-90fb-354bb05a1596.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-5a30626f-28da-494b-b8c1-d0bb8025fe7d.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-5a30626f-28da-494b-b8c1-d0bb8025fe7d.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bdf08e8aaac50f890bc1d509af3dbb4a1c448279 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-5a30626f-28da-494b-b8c1-d0bb8025fe7d.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-5b677522-3760-4cfb-956b-27af3b811227.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-5b677522-3760-4cfb-956b-27af3b811227.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5c6a184bf3deecd7b2f3bff3cf0f92f42c2e253e Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-5b677522-3760-4cfb-956b-27af3b811227.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-6b7b45fa-510e-44fb-b81f-88589900636c.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-6b7b45fa-510e-44fb-b81f-88589900636c.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2d89e5a8e7aa2f11198b82e067f73d313df3b786 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-6b7b45fa-510e-44fb-b81f-88589900636c.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-6f35aed5-a725-41a2-96ee-bfcb481abd03.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-6f35aed5-a725-41a2-96ee-bfcb481abd03.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dc1a6444813baccebd984a816a3eb32aa8883a16 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-6f35aed5-a725-41a2-96ee-bfcb481abd03.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-705ec3d5-41c0-4321-a1bf-6dbcfc0a8f62.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-705ec3d5-41c0-4321-a1bf-6dbcfc0a8f62.jpg new file mode 100644 index 0000000000000000000000000000000000000000..cdb93fde5634395f7cbe03734e9aa916b0f98e44 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-705ec3d5-41c0-4321-a1bf-6dbcfc0a8f62.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-78fedc8b-4ed3-4580-9077-867ee8f898d2.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-78fedc8b-4ed3-4580-9077-867ee8f898d2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..38746e9c3d0ef7ac7cc9e99c954fda52a15df5cb Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-78fedc8b-4ed3-4580-9077-867ee8f898d2.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-7b8c3321-e6d4-4462-b6f5-b10e7cb1108b.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-7b8c3321-e6d4-4462-b6f5-b10e7cb1108b.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3991489183a108e695414e60e4179182023752d1 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-7b8c3321-e6d4-4462-b6f5-b10e7cb1108b.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-812a9c92-03af-49a9-8833-3f618ebda928.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-812a9c92-03af-49a9-8833-3f618ebda928.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3ca03bd6f4eda53bdccd02ff4de51ef9350e39e8 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-812a9c92-03af-49a9-8833-3f618ebda928.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-85514d47-ce74-4842-9f54-f35b363942a6.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-85514d47-ce74-4842-9f54-f35b363942a6.jpg new file mode 100644 index 0000000000000000000000000000000000000000..16c4b2c946ee10462833fe98bb1edc236d460069 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-85514d47-ce74-4842-9f54-f35b363942a6.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-8a18e8e2-b5c3-4834-90ee-4622dc31a462.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-8a18e8e2-b5c3-4834-90ee-4622dc31a462.jpg new file mode 100644 index 0000000000000000000000000000000000000000..40943a324b50dec62285bee813c65aade4f67e88 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-8a18e8e2-b5c3-4834-90ee-4622dc31a462.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-8dba29ac-391e-4370-8709-7c92679f4d3f.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-8dba29ac-391e-4370-8709-7c92679f4d3f.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fe4a9dd61cc7b98797889fd3038a193237bd5908 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-8dba29ac-391e-4370-8709-7c92679f4d3f.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-91248113-54bd-4532-a639-5f64248e362a.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-91248113-54bd-4532-a639-5f64248e362a.jpg new file mode 100644 index 0000000000000000000000000000000000000000..67068670b417274c7093ff0146bec3854448f22c Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-91248113-54bd-4532-a639-5f64248e362a.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-92b096f5-4132-4448-bafe-3220393762bf.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-92b096f5-4132-4448-bafe-3220393762bf.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a5031da82a2e357f9701077c4fb310277e0807f9 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-92b096f5-4132-4448-bafe-3220393762bf.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-9c2f1045-2449-4fa9-b579-b113b94d9870.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-9c2f1045-2449-4fa9-b579-b113b94d9870.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9afb89d72b471da9e050c649041ae331857a4f92 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-9c2f1045-2449-4fa9-b579-b113b94d9870.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-9dedc4e9-6434-4b79-ab6d-5a0600daa45b.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-9dedc4e9-6434-4b79-ab6d-5a0600daa45b.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b4607aaf89356a092e6616cdc30741a4db077c8f Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-9dedc4e9-6434-4b79-ab6d-5a0600daa45b.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-9e382893-619c-493d-ae29-4a55bd7eb9f7.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-9e382893-619c-493d-ae29-4a55bd7eb9f7.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dca6f52292a21e7d4b6c487cdf79d5cf5b96f9c7 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-9e382893-619c-493d-ae29-4a55bd7eb9f7.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-a4aacebb-e56a-4387-b717-13bef97ccb99.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-a4aacebb-e56a-4387-b717-13bef97ccb99.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6eaa663cb5c826323b7f5740eda3b40b0f79e272 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-a4aacebb-e56a-4387-b717-13bef97ccb99.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-a68777fb-36e2-4681-9fd5-b7db7414d1c8.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-a68777fb-36e2-4681-9fd5-b7db7414d1c8.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c304cda4e6e80d0c90d1db3cc56d6a4ec62057a0 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-a68777fb-36e2-4681-9fd5-b7db7414d1c8.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-a6900293-7500-4b5c-bd48-1e77c6b5c260.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-a6900293-7500-4b5c-bd48-1e77c6b5c260.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ef3bac2968b506911af0dbcb82efbeeb86f49184 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-a6900293-7500-4b5c-bd48-1e77c6b5c260.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-ad21eda6-e867-4f42-8834-ab9a4282396f.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-ad21eda6-e867-4f42-8834-ab9a4282396f.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4ae476a9efd65ad51119a9bb523ce8a0c3a64623 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-ad21eda6-e867-4f42-8834-ab9a4282396f.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-ae188ad2-d81f-497b-8fd1-8f8e09c06239.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-ae188ad2-d81f-497b-8fd1-8f8e09c06239.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c736bd2753861360ca4fa68b6518341599655b29 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-ae188ad2-d81f-497b-8fd1-8f8e09c06239.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-aeb8a9c9-2776-4833-8c92-bfa8e04cd3e4.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-aeb8a9c9-2776-4833-8c92-bfa8e04cd3e4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bf9830c384e065065bd273b53fa5d9e565a77dfa Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-aeb8a9c9-2776-4833-8c92-bfa8e04cd3e4.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-b15f48b0-ee63-4f23-bf0c-98e14d18bdaa.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-b15f48b0-ee63-4f23-bf0c-98e14d18bdaa.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c9ff7ec6c343f536948191088a9eead3385992de Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-b15f48b0-ee63-4f23-bf0c-98e14d18bdaa.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-b339dde2-e0aa-4554-a6d0-d9ecc46248b5.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-b339dde2-e0aa-4554-a6d0-d9ecc46248b5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d47d28bafee3e83baebb05cc8b6cea221e1886ca Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-b339dde2-e0aa-4554-a6d0-d9ecc46248b5.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-b508394c-62c2-41a5-a724-6c94de7f8aaa.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-b508394c-62c2-41a5-a724-6c94de7f8aaa.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c10d882dc4879f53f8c372dd63dac7e29842f4ca Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-b508394c-62c2-41a5-a724-6c94de7f8aaa.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-b65fb6b6-dea7-45e2-96ad-e2e83430072e.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-b65fb6b6-dea7-45e2-96ad-e2e83430072e.jpg new file mode 100644 index 0000000000000000000000000000000000000000..69cdf0414a4a856e4c8027a0a6349df85733116d Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-b65fb6b6-dea7-45e2-96ad-e2e83430072e.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-b7bd6ce5-0cec-4f31-8bbf-d4ea8a5e7507.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-b7bd6ce5-0cec-4f31-8bbf-d4ea8a5e7507.jpg new file mode 100644 index 0000000000000000000000000000000000000000..756b7a9b7d8f1d351e3496029159d448998b6d33 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-b7bd6ce5-0cec-4f31-8bbf-d4ea8a5e7507.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-b8e444fc-643d-42a4-adb2-8228a4c644b0.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-b8e444fc-643d-42a4-adb2-8228a4c644b0.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0072580af52d02a86e26b1781207b139312fd257 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-b8e444fc-643d-42a4-adb2-8228a4c644b0.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-bfccf30a-f56e-431e-a51c-45e63c312b3f.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-bfccf30a-f56e-431e-a51c-45e63c312b3f.jpg new file mode 100644 index 0000000000000000000000000000000000000000..220bf2432b121f55849b478210e7ffada6af5af8 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-bfccf30a-f56e-431e-a51c-45e63c312b3f.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-c0ecc5fd-be1f-41c9-a7f6-06691774ff69.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-c0ecc5fd-be1f-41c9-a7f6-06691774ff69.jpg new file mode 100644 index 0000000000000000000000000000000000000000..03ecbf112a611a0bee0631ee625f719fea42d550 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-c0ecc5fd-be1f-41c9-a7f6-06691774ff69.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-c97a08e2-7016-4292-be4d-de057147e320.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-c97a08e2-7016-4292-be4d-de057147e320.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bcd40fb0af00de78091f81f4d40e1b5efbb529b7 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-c97a08e2-7016-4292-be4d-de057147e320.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-caf81351-a499-4b88-bd74-455333d4d9aa.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-caf81351-a499-4b88-bd74-455333d4d9aa.jpg new file mode 100644 index 0000000000000000000000000000000000000000..495b8296249e48f6e8b3452fc5e57281951e536a Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-caf81351-a499-4b88-bd74-455333d4d9aa.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-ce217e8b-4c11-4edf-99c8-85ad011eede8.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-ce217e8b-4c11-4edf-99c8-85ad011eede8.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4a95fcd61e3469a37bf6d31a8186a2514b2516a5 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-ce217e8b-4c11-4edf-99c8-85ad011eede8.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-d33887ee-fa82-4f95-9d96-7e477b056d28.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-d33887ee-fa82-4f95-9d96-7e477b056d28.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5335a9318b62e39991d99c2a4012cc8c50ca02ad Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-d33887ee-fa82-4f95-9d96-7e477b056d28.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-d47f0eb7-131d-4ff9-94d7-a6a2af5046bb.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-d47f0eb7-131d-4ff9-94d7-a6a2af5046bb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2b73e9f275d47f7312b265fc1bb3fc034e9985b6 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-d47f0eb7-131d-4ff9-94d7-a6a2af5046bb.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-d66c5cac-d648-428a-a344-20dfd511c3bc.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-d66c5cac-d648-428a-a344-20dfd511c3bc.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0aec5657af925ae571289c8bb75e5949568dc4f1 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-d66c5cac-d648-428a-a344-20dfd511c3bc.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-da9819ba-ae1f-4748-9e37-ae367c6708fd.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-da9819ba-ae1f-4748-9e37-ae367c6708fd.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a3ab18fbdd8e86cad5ed1441a2fff585b740535f Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-da9819ba-ae1f-4748-9e37-ae367c6708fd.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-db0b89d3-f370-4725-bb87-4c66a7387dbe.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-db0b89d3-f370-4725-bb87-4c66a7387dbe.jpg new file mode 100644 index 0000000000000000000000000000000000000000..45222a67cffe15bb14fa98f8acff8e8f5a8f6a50 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-db0b89d3-f370-4725-bb87-4c66a7387dbe.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-df18226b-3c94-42bb-adb2-9e381c5c8c21.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-df18226b-3c94-42bb-adb2-9e381c5c8c21.jpg new file mode 100644 index 0000000000000000000000000000000000000000..af55ab8762e10afdc2fc9d97c4705b67c61afb79 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-df18226b-3c94-42bb-adb2-9e381c5c8c21.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-df43ae49-c73e-459a-b09b-4009624baf92.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-df43ae49-c73e-459a-b09b-4009624baf92.jpg new file mode 100644 index 0000000000000000000000000000000000000000..53720aea3d36d59f2d87424ea77d2c824e808e07 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-df43ae49-c73e-459a-b09b-4009624baf92.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-e3c0d53f-c7d2-4110-b44a-7d14465e120a.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-e3c0d53f-c7d2-4110-b44a-7d14465e120a.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c7d89a8fbd3db580d0cab9d94c3dd7b05b48ebc0 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-e3c0d53f-c7d2-4110-b44a-7d14465e120a.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-e5f3f404-beb8-49c1-ad70-0b1352480113.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-e5f3f404-beb8-49c1-ad70-0b1352480113.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b4ecb1c880e7e68822e6a838c0c378897ac1f88c Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-e5f3f404-beb8-49c1-ad70-0b1352480113.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-e75bd59f-2f95-4dfb-b16c-c3f4533767d1.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-e75bd59f-2f95-4dfb-b16c-c3f4533767d1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..896012d6a7ff0431015ab3349988e567f9ffb682 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-e75bd59f-2f95-4dfb-b16c-c3f4533767d1.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-e78eca5d-653a-4441-8cf9-6928131c0d14.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-e78eca5d-653a-4441-8cf9-6928131c0d14.jpg new file mode 100644 index 0000000000000000000000000000000000000000..62ca47f7da14067861f72b762bb72ca7054de503 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-e78eca5d-653a-4441-8cf9-6928131c0d14.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-e8b2d21b-c8ca-488a-bf99-fab5fe131004.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-e8b2d21b-c8ca-488a-bf99-fab5fe131004.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9c1f59477a35280802ad50ab8380dee84e3bf545 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-e8b2d21b-c8ca-488a-bf99-fab5fe131004.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-ed54f377-1de9-4d0e-94fe-2ad36470ef33.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-ed54f377-1de9-4d0e-94fe-2ad36470ef33.jpg new file mode 100644 index 0000000000000000000000000000000000000000..edd1567ae267582726eb2d641485654beb3639ac Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-ed54f377-1de9-4d0e-94fe-2ad36470ef33.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-ee619aa4-647c-423f-921c-063d22af5bde.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-ee619aa4-647c-423f-921c-063d22af5bde.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2b845289af0e13f3c3bb73e936eb2906fb9b3571 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-ee619aa4-647c-423f-921c-063d22af5bde.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-efa7ea29-7429-4036-af59-76222fba45f1.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-efa7ea29-7429-4036-af59-76222fba45f1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7930383b8955f82839b79546c2aa0f6b430a9908 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-efa7ea29-7429-4036-af59-76222fba45f1.jpg differ diff --git a/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-fe58ed47-bffe-4d48-a574-5a3c56450587.jpg b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-fe58ed47-bffe-4d48-a574-5a3c56450587.jpg new file mode 100644 index 0000000000000000000000000000000000000000..7785c1bc5df4ab84c085f95fc1b50163a7bd7182 Binary files /dev/null and b/images/nice-article/weixin-ztpxspringaopymxbjrynkddsqsxwdxg-fe58ed47-bffe-4d48-a574-5a3c56450587.jpg differ diff --git a/images/nice-article/zhihu-weilxhdmnjclnxhxg-16bb1fd8-d124-4119-874c-190e9e1eeb30.jpg b/images/nice-article/zhihu-weilxhdmnjclnxhxg-16bb1fd8-d124-4119-874c-190e9e1eeb30.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8933cce04adbd5a47284f0bc9b252ce53d245b87 Binary files /dev/null and b/images/nice-article/zhihu-weilxhdmnjclnxhxg-16bb1fd8-d124-4119-874c-190e9e1eeb30.jpg differ diff --git a/images/nice-article/zhihu-weilxhdmnjclnxhxg-1ba20865-0653-4c6b-a44e-7acf27753bae.jpg b/images/nice-article/zhihu-weilxhdmnjclnxhxg-1ba20865-0653-4c6b-a44e-7acf27753bae.jpg new file mode 100644 index 0000000000000000000000000000000000000000..717e3b710cd40b8d7573c6f7f99337a27c1b5963 Binary files /dev/null and b/images/nice-article/zhihu-weilxhdmnjclnxhxg-1ba20865-0653-4c6b-a44e-7acf27753bae.jpg differ diff --git a/images/nice-article/zhihu-weilxhdmnjclnxhxg-21501f9f-9222-442a-a9bb-64cf21d59d75.jpg b/images/nice-article/zhihu-weilxhdmnjclnxhxg-21501f9f-9222-442a-a9bb-64cf21d59d75.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2e81e5ada65add42c4b9fb08bad600736bd3359a Binary files /dev/null and b/images/nice-article/zhihu-weilxhdmnjclnxhxg-21501f9f-9222-442a-a9bb-64cf21d59d75.jpg differ diff --git a/images/nice-article/zhihu-weilxhdmnjclnxhxg-25fdbf74-e133-4bd6-92fe-94324f759dce.jpg b/images/nice-article/zhihu-weilxhdmnjclnxhxg-25fdbf74-e133-4bd6-92fe-94324f759dce.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4bc8efb4b3bbf34c47b2154117581af997b10a51 Binary files /dev/null and b/images/nice-article/zhihu-weilxhdmnjclnxhxg-25fdbf74-e133-4bd6-92fe-94324f759dce.jpg differ diff --git a/images/nice-article/zhihu-weilxhdmnjclnxhxg-39f55c2d-fac6-4f26-bede-5ddfd9e3e931.jpg b/images/nice-article/zhihu-weilxhdmnjclnxhxg-39f55c2d-fac6-4f26-bede-5ddfd9e3e931.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d646c949ee74d5e936488e7e4686331b45a0fb69 Binary files /dev/null and b/images/nice-article/zhihu-weilxhdmnjclnxhxg-39f55c2d-fac6-4f26-bede-5ddfd9e3e931.jpg differ diff --git a/images/nice-article/zhihu-weilxhdmnjclnxhxg-58f90b6f-d277-49a8-a40b-76cbd1dfd3eb.jpg b/images/nice-article/zhihu-weilxhdmnjclnxhxg-58f90b6f-d277-49a8-a40b-76cbd1dfd3eb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1dfe48dfb379f9087e020f80cf18abba75d9965e Binary files /dev/null and b/images/nice-article/zhihu-weilxhdmnjclnxhxg-58f90b6f-d277-49a8-a40b-76cbd1dfd3eb.jpg differ diff --git a/images/nice-article/zhihu-weilxhdmnjclnxhxg-640a45e5-f68a-40ca-9490-a419a82e12ce.jpg b/images/nice-article/zhihu-weilxhdmnjclnxhxg-640a45e5-f68a-40ca-9490-a419a82e12ce.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3332da81c3697488901dc2407b63c9d217c61ad9 Binary files /dev/null and b/images/nice-article/zhihu-weilxhdmnjclnxhxg-640a45e5-f68a-40ca-9490-a419a82e12ce.jpg differ diff --git a/images/nice-article/zhihu-weilxhdmnjclnxhxg-70173f4d-6904-4bb3-84c7-0722825c0160.jpg b/images/nice-article/zhihu-weilxhdmnjclnxhxg-70173f4d-6904-4bb3-84c7-0722825c0160.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4945d165dd2a8f0bafca9c0697428ce23f72ce9b Binary files /dev/null and b/images/nice-article/zhihu-weilxhdmnjclnxhxg-70173f4d-6904-4bb3-84c7-0722825c0160.jpg differ diff --git a/images/nice-article/zhihu-weilxhdmnjclnxhxg-70fb43d2-276d-4386-b2f1-11341435492a.jpg b/images/nice-article/zhihu-weilxhdmnjclnxhxg-70fb43d2-276d-4386-b2f1-11341435492a.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c0b4d89b086c77f4f4002bac58435d0a06a369f5 Binary files /dev/null and b/images/nice-article/zhihu-weilxhdmnjclnxhxg-70fb43d2-276d-4386-b2f1-11341435492a.jpg differ diff --git a/images/nice-article/zhihu-weilxhdmnjclnxhxg-799f8cb1-cac7-4dde-88fd-ddee95682ddb.jpg b/images/nice-article/zhihu-weilxhdmnjclnxhxg-799f8cb1-cac7-4dde-88fd-ddee95682ddb.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8ab944a667a66a3bd44aee7d31ae7cf52cc24eec Binary files /dev/null and b/images/nice-article/zhihu-weilxhdmnjclnxhxg-799f8cb1-cac7-4dde-88fd-ddee95682ddb.jpg differ diff --git a/images/nice-article/zhihu-weilxhdmnjclnxhxg-872744dc-d29f-41be-90f5-85f9c8ffde05.jpg b/images/nice-article/zhihu-weilxhdmnjclnxhxg-872744dc-d29f-41be-90f5-85f9c8ffde05.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8a78af2b22860b0dfe129109226e443e4fe34729 Binary files /dev/null and b/images/nice-article/zhihu-weilxhdmnjclnxhxg-872744dc-d29f-41be-90f5-85f9c8ffde05.jpg differ diff --git a/images/nice-article/zhihu-weilxhdmnjclnxhxg-c3e327e3-dab9-4078-8439-de67aab4f503.jpg b/images/nice-article/zhihu-weilxhdmnjclnxhxg-c3e327e3-dab9-4078-8439-de67aab4f503.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a49d163e85aba8ffbb6bd17936fb5b7589a07cf5 Binary files /dev/null and b/images/nice-article/zhihu-weilxhdmnjclnxhxg-c3e327e3-dab9-4078-8439-de67aab4f503.jpg differ diff --git a/images/nice-article/zhihu-weilxhdmnjclnxhxg-e13e425b-2b22-4b84-b64a-44d1d74a0887.jpg b/images/nice-article/zhihu-weilxhdmnjclnxhxg-e13e425b-2b22-4b84-b64a-44d1d74a0887.jpg new file mode 100644 index 0000000000000000000000000000000000000000..04907e93f0ae708a67c42444f2d5376c83770839 Binary files /dev/null and b/images/nice-article/zhihu-weilxhdmnjclnxhxg-e13e425b-2b22-4b84-b64a-44d1d74a0887.jpg differ diff --git a/images/nice-article/zhihu-weilxhdmnjclnxhxg-f5cd1f28-dbf4-4ff0-b89a-a2f30286b862.jpg b/images/nice-article/zhihu-weilxhdmnjclnxhxg-f5cd1f28-dbf4-4ff0-b89a-a2f30286b862.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b883ad9c6244261b91d980f89182a0cd4cd12c04 Binary files /dev/null and b/images/nice-article/zhihu-weilxhdmnjclnxhxg-f5cd1f28-dbf4-4ff0-b89a-a2f30286b862.jpg differ diff --git a/images/nice-article/zhihu-weilxhdmnjclnxhxg-f9b0fcda-fe3f-4538-8b58-226c96d7d96e.jpg b/images/nice-article/zhihu-weilxhdmnjclnxhxg-f9b0fcda-fe3f-4538-8b58-226c96d7d96e.jpg new file mode 100644 index 0000000000000000000000000000000000000000..61e72155b207a4d70fd2cb2d896703ab0b0a1de0 Binary files /dev/null and b/images/nice-article/zhihu-weilxhdmnjclnxhxg-f9b0fcda-fe3f-4538-8b58-226c96d7d96e.jpg differ