Just Do Java

Java 's Blog


  • 首页

  • 分类

  • 作者

  • 归档

  • 关于

全网最全Log配置教程及框架性能比较,看这篇就够了!

发表于 2020-10-21 | 分类于 java

学习log配置,看这篇就够了!

阅读全文 »

这年头还有问Tomcat调优和JVM参数优化的,你还不知道怎么回答么?那么你一定需要看看这篇文章

发表于 2020-10-20 | 分类于 Java

前几天阿粉的一个小学弟在咨询阿粉面试的时候怎么还会问到关于Tomcat调优和JVM优化,我听完这个的时候,当时就想说,问这个不是应该的么?那么下面阿粉就给大家好好的掰扯掰扯这个Tomcat优化和 JVM 参数优化的事情

阅读全文 »

阿粉带你几百行代码手撸搜索引擎

发表于 2020-10-17 | 分类于 Java

Hello 大家好,我是鸭血粉丝,大家都叫我阿粉,搜索引擎想必大家一定不会默认,我们项目中经常使用的 ElasticSearch 就是一种搜索引擎,在我们的日志系统中必不可少,ELK 作为一个整体,基本上是运维标配了,另外目前的搜索引擎底层都是基于 Lucene 来实现的。

阿粉最近遇到一个需求,因为数据量没有达到需要使用 ElasticSearch 的级别,也不想单独部署一套集群,所以准备自己基于 Lucene 实现一个简易的搜索服务。下面我们一起来看一下吧。

阅读全文 »

阿粉教你如何使用爬虫来对比某东上的数据

发表于 2020-10-15 | 分类于 Java

自从阿粉经历过上次的大数据杀熟事件之后,明显感觉现在的平台对于用户非常的不友好呀,只要你高频的搜索某些关键词的同时,却往往是越对比,直接就买在了最高峰,就和买股票一样,每次总感觉能抄底,殊不知买在了天台。于是阿粉想了个办法,把所有的数据扒拉下来,我自己做对比,也不去搜索了,省的平台上总是根据我的搜索内容去进行推荐。

阅读全文 »

乖,答应我,这些 Linux 命令你一定要常用

发表于 2020-10-14 | 分类于 Linux

想要玩转 Linux 系统的话,平时就要多实践,多用,暖暖的阿粉都替你想到了,赶紧来总结一篇,照着多实践,跟着阿粉不会翻车

阅读全文 »

这个国庆长假,阿粉被骗了!!

发表于 2020-10-12 | 分类于 Java

┭┮﹏┭┮,大家好,我是鸭血粉丝,今天给大家分享一个国庆碰到的经历,希望大家以后遇到提高警惕,不要再被套路了。

阅读全文 »

这个中秋国庆你被邀请参加几场婚礼,少于三场的请自觉走开

发表于 2020-10-11 | 分类于 Java

Hello 大家好,我是鸭血粉丝,这个中秋国庆注定是一个繁忙的日子,国庆本身就是一个结婚订婚的高峰期,再加上上半年因为疫情的缘故很多人的婚期都延期举行,这个国庆结婚的就更多了。所以这个国庆你参加了几场呢?那些去不了的你又出了多少份子钱呢?

阅读全文 »

中美日印程序员收入对比

发表于 2020-10-11 | 分类于 java

差别到底有多大呢?

阅读全文 »

关于 缓存穿透/缓存击穿/缓存雪崩 看这篇文章就够了

发表于 2020-10-07 | 分类于 redis

redis 在项目中用的话,主要就是用作缓存了

阅读全文 »

只听说过用python做爬虫,java程序员笑了!

发表于 2020-10-06 | 分类于 java

网络爬虫技术,早在万维网诞生的时候,就已经出现了,今天我们就一起来揭开它神秘的面纱!

阅读全文 »

不要听信那些程序员不需要学英语的毒鸡汤

发表于 2020-10-05 | 分类于 Java

前天的时候,也就是国庆刚刚过的几天的时候,一个之前在学校的小学弟在问阿粉,说现在想入行当程序员,需要准备什么样子的知识,于是阿粉就给他提出了一些意见,比如先掌握好基础,然后代码规范,以及之后的框架什么的,这时候,小学弟问了一句,对英语的要求高么?阿粉说英语不太好的话,问题不太大,但是还是要学习英语的。

阅读全文 »

面试官:三个线程顺序执行,你来说说有几种实现方式?

发表于 2020-10-01 | 分类于 Java并发

能想起来几种呢?

阅读全文 »

高铁晚点,滴滴崩了,千万杭州网友直呼出城好难!!

发表于 2020-10-01 | 分类于 Java

长假第一天,不知道各位小伙伴玩的可好?

阿粉就比较惨了,刚买好的回家的动车票,领导就告知长假前两天还需要加班,赶下项目的进度。

本来还想吐槽抱怨的,不过听到领导说国庆加班三倍工资,哎,算了算了,辛苦一点算什么?为公司服务~

哈哈,幸好今年长假有八天,少了两天也无妨。

好了,不扯这个了,不知道各位出去玩之路,是否顺利?是不是也堵在路上了?

阅读全文 »

SpringBoot2.x 整合 thumbnailator 图片处理

发表于 2020-09-28 | 分类于 SpringBoot

1、序

在实际项目中,有时为了响应速度,难免会对一些高清图片进行一些处理,比如图片压缩之类的,而其中压缩可能就是最为常见的。最近,阿粉就被要求实现这个功能,原因是客户那边嫌速度过慢。借此机会,阿粉今儿就给大家介绍一些一下我做这个功能时使用的 Thumbnailator 库。

阅读全文 »

记一次项目中遇到的坑

发表于 2020-09-28 | 分类于 Java

hello~各位读者好,我是鸭血粉丝(大家可以称呼我为「阿粉」)。今天,阿粉带着大家来了解一下 最近在项目中遇到的一个坑。

阅读全文 »

Redis 实例对比工具之 Redis-full-check

发表于 2020-09-27 | 分类于 Java

Hello 大家好,我是鸭血粉丝,前面一篇文章给大家介绍了 SpringBoot 项目是如何从单机切换接入集群的,没看过的小伙伴可以去看一下SpringBoot 项目接入 Redis 集群 。这篇文章给大家介绍一个 Redis 工具 redis-full-check,主要是用来校验迁移数据过后的准确性,下面我们来看一下。

阅读全文 »

为何建议技术人写写博客?

发表于 2020-09-25 | 分类于 其他

前言

在阿粉刚刚选择走上程序员道路的时候,脑海中还没有技术博客这个概念。那个时候入门靠的是培训班的视频,初学的过程中总会遇到许多陌生的概念,视频里没听懂的话一般会选择到搜索引擎去搜一下,多看几种不同的解释进行消化,也就是从这时开始接触到的技术博客。

在最开始的时候,我对博客的理解和我们读书时候做的笔记差不多,就是把学到的知识记录下来。但是慢慢的,我开始接触到了一些比较优秀的博客,他们的共性是能够把一个知识点讲得很清楚,能给出自己的理解,或者有适当的示例代码帮助读者理解。慢慢地我也萌发了要写博客的念头,初衷很简单,就是要把自己理解的某个知识点用自己的话分享出来。

屈指一算,从开创博客园账号至今也已经一年半了,自己的博客记录了自己的技术成长过程,收获了很多,下面我就给大家分享一下写博客能给大家带来什么好处吧。

1. 帮助我们理解知识

首先写博客能帮助我们很好地梳理并掌握一个知识点。不知道大家有没有听过这样的话:在学一个知识点的时候,如果只是听一遍讲,那你大概能掌握10%;做了笔记,大概掌握25%;能做出相应的题目,掌握50%;如果能把这个知识点教授给别人的话,那么就掌握了80%了。如果我们把写博客当成一个给他人传授知识的过程,当我们的博客写完了,自然地我们也就掌握了这个知识。当然这个过程是非常不容易的,想要把知识传授给他人,首先我们自己要吃透了这个知识。我个人在写博客的时候常常会遇到这么一种情况:写着写着就写不下去了,发现自己其实没有搞懂,理解透彻某个知识。为了把博客写下去,会强迫自己去把相关的知识搞懂。当我们通过博客的形式把一个知识点讲懂之后,其实我们就明白了一个知识点的来龙去脉,这对我们形成系统的知识体系很有帮助。

2. 获得成就感

写博客除了能帮助我们巩固理解知识外,还能给我们带来一些学习之外的乐趣。就我自己而言,每当我写的文章被别人评论或点赞,心里都会暗暗一乐,毕竟大多数情况下人还是希望得到他人认可的。尽管有时候得到的也不全是认可,可能会有其他小伙伴指出你的不足,也不失是一次学习的机会。

3. 提高影响力

在我个人看来,写博客还能提高自己的影响力,你的每一篇博客都是一次能力的展示,如果你的内容足够优秀的话,这些博客就是你的一张名片。我曾经因为博客收到过出版社的出书邀约,大厂的面试邀约等,尽管当时知道自己还没有达到那个水平,但还是蛮开心的。

4. 面试加分项

在面试写简历的时候,我们可以直接放上自己的博客链接,在同等水平的情况下,长期精心维护的技术博客是很有可能成为加分项的,毕竟大家都喜欢乐于分享知识的人。我曾经经历过一场有趣的面试,那是一场腾讯的主管面试,采用视频面试。面试的形式很常规,面试官抛出一个知识点,让我能讲多少讲多少。当时不知道为啥,他问的内容很多都是我掌握的比较好的内容。等面试结束的时候他告诉我他从面试开始就一直在看我的博客,刚好我的博客涉及的知识点也比较多,他就直接从上面挑知识问了,并对我的博客给予了肯定。虽然这是小概率事件了,但是也从侧面说明总有一天你的博客会帮上忙的。

后话

不知道以上写博客的好处能不能打动你,在我个人看来,写博客是一件百利无一害的事情,可能唯一比较麻烦的就是写博客比较费时间,不过我想花出去的时间能获得以上四个方面的收获也是值得的。把写博客当成一种习惯吧,坚持下来一定会有所收获的。

阅读全文 »

原来使用 Spring 实现策略模式可以这么简单!

发表于 2020-09-23 | 分类于 Java

Hello,大家好,我是鸭血粉丝~

最近看同事的代码时候,学到了个小技巧,在某些场景下非常挺有用的,这里分享一下给大家。

Spring 中 @Autowired注解,大家应该不会陌生,用过 Spring 的肯定也离不开这个注解,通过这个注解可以帮我们自动注入我们想要的 Bean。

除了这个基本功能之外,@Autowired 还有更加强大的功能,还可以注入指定类型的数组,List/Set 集合,甚至还可以是 Map 对象。

比如说当前应用有一个支付接口 PayService,分别需要对接支付宝、微信支付、银行卡,所以分别有三个不同实现类 AliPayService,WechatPayservice,BankCardPayService。

四个类的关系如下图所示:

如果此时我需要获取当前系统类所有 PayService Bean,老的方式我们只能通过 BeanFactory或者 ApplicationContext 获取。

1
2
3
4
5
6
7
8
9
10
11
// 首先通过 getBeanNamesForType 获取 PayService 类型所有的 Bean
String[] names = ctx.getBeanNamesForType(PayService.class);
List<PayService> anotherPayService = Lists.newArrayList();
for (String beanName : names) {
    anotherPayService.add(ctx.getBean(beanName, PayService.class));
}
// 或者通过 getBeansOfType 获取所有 PayService 类型
Map<String, PayService> beansOfType = ctx.getBeansOfType(PayService.class);
for (Map.Entry<String, PayService> entry : beansOfType.entrySet()) {
    anotherPayService.add(entry.getValue());
}

但是现在我们可以不用这么麻烦了,我们可以直接使用 @Autowired 注入 PayService Bean 数组,或者 PayService List/Set 集合,甚至,我们还可以注入 PayService 的 Map 集合。

1
2
3
4
5
@Autowired
List<PayService> payServices;

@Autowired
PayService[] payServicesArray;

知道了这个功能,当我们需要使用 Spring 实现策略模式就非常简单。

可能有的小伙伴不太了解策略模式,没关系,这类阿粉介绍一个业务场景,通过这个场景给大家介绍一下策略模式。

还是上面的例子,我们当前系统需要对接微信支付、支付宝、以及银行卡支付。

当接到这个需求,我们首先需要拿到相应接口文档,分析三者的共性。

假设我们这里发现,三者模式比较类似,只是部分传参不一样。

所以我们根据三者的共性,抽象出一组公共的接口 PayService,

1
2
3
public interface PayService {
    PayResult epay(PayRequest request);
}

然后分别实现三个实现类,都继承这个接口。

那么现在问题来了,由于存在三个实现类,如何选择具体的实现类?

其实这个问题很好解决,请求参数传入一个唯一标识,然后我们根据标识选择相应的实现类。

比如说我们在请求类 PayRequest 搞个 channelNo 字段,这个代表相应支付渠道唯一标识,比如说支付宝为:00000001,微信支付为 00000002,银行卡支付为 00000003。

接着我们需要把唯一标识与具体实现类一一映射起来,刚好我们可以使用 Map 存储这种映射关系。

我们实现一个 RouteService,具体代码逻辑如下:

1
2
3
4
5
6
7
8
9
10
11
12
@Service
public class RouteService {

    @Autowired
    Map<String, PayService> payServiceMap;

    public PayResult epay(PayRequest payRequest) {
        PayService payService = payServiceMap.get(payRequest.getChannelNo());
        return  payService.epay(payRequest);
    }

}

我们在 RouteService 自动注入 PayService 所有相关 Bean,然后使用唯一标识查找实现类。

这样我们对外就屏蔽了支付渠道的差异,其他服务类只要调用 RouteService 即可。

但是这样实现还是有点小问题,由于我们唯一标识为一串数字,如果像我们上面直接使用 @Autowired注入 Map,这就需要我们实现类的 Bean 名字为 00000001 这些。

但是这样命名不是很优雅,这样会让后来同学很难看懂,不好维护。

所以我们需要做个转换,我们可以这么实现。

首先我们改造一下 PayService 这个接口,增加一个方法,每个具体实现类通过这个方法返回其唯一标识。

1
2
3
4
5
6
public interface PayService {

    PayResult epay(PayRequest request);

    String channel();
}

具体举个支付宝实现类的代码,其他实现类实现类似。

1
2
3
4
5
6
7
8
9
10
11
12
13
@Service("aliPayService")
public class AliPayService implements PayService {

    @Override
    public PayResult epay(PayRequest request) {
        // 业务逻辑
        return new PayResult();
    }
    @Override
    public String channel() {
        return "00000001";
    }
}

最后我们改造一下 RouteService,具体逻辑如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Service
public class RouteService {

    @Autowired
    Set<PayService> payServiceSet;
    
    Map<String, PayService> payServiceMap;

    public PayResult epay(PayRequest payRequest) {
        PayService payService = payServiceMap.get(payRequest.getChannelNo());
        return  payService.epay(payRequest);
    }

    @PostConstruct
    public void init() {
        for (PayService payService : payServiceSet) {
            payServiceMap = new HashMap<>();
            payServiceMap.put(payService.channel(), payService);
        }
    }
}

上面代码首先通过自动注入 ` PayService 一个集合,然后我们再将其转为一个 Map`,这样内部存储刚好是唯一标识与实现类的映射了。

好了,今天的小技巧就分享到这里,学到小伙伴,不妨点个赞吧。

阅读全文 »

如果时间可以倒流

发表于 2020-09-22 | 分类于 程序生活

阿粉一定鼓足勇气,跟喜欢的女生表白

今天同事问阿粉一个问题,觉得挺有意义的,在这里也问问各位读者们:如果时间可以倒流,你最想做什么呢?为什么呢?

这个问题阿粉也问了问身边的一些朋友们,下面是他们的答案,或许可以给你一些启发

朋友 A :如果时间可以倒流,我特别想要回到高中的时候,好好学习,踏踏实实的去努力,好好读书。不是那种死板教条的读书,是有计划有效率的读书,希望自己能够死不要脸一些,多向老师和同学请教问题,我可能天资不够聪慧,但是如果能够有效率一些,死不要脸一些,最起码会比现在要好得多吧

朋友 B :我想回到高三结束的那个暑假啊,跟喜欢的女生表白。我也是后来才知道,当时我喜欢的那个女生,对我也有好感,我当时但凡是再勇敢一点儿,也不至于母胎 solo …

朋友 C :我跟你讲,要是能回到过去的话,我就回到 2006 年 6 月 1 日,中国船泊 5 元钱,全部身价买了后 2007 年 9 月 298 抛,然后买房子,然后入股腾讯阿里,在微信刚起来的时候就去做公众号,这样的话 2020 年的我可能算不上首富,但起码也可以算是人生赢家了(狗头保命

朋友 D :我希望我能回到初中的时候,告诉自己你很棒,自信一些。我以前就是一个比较敏感的小女生,非常在意别人看法,心情不愉快的时候就是自己憋着,也不会和别人人沟通,一个人硬抗。有的时候,朋友就会跟我说比较喜欢我,对我称赞有加,但是因为我不是很自信,所以对自己的闪光点视而不见。这些年在男朋友的耐心陪伴下才慢慢建立起自己的自信心,才敢表达自己的想法,说到这里,想和所有的女生说一句,你就是最棒的,不要怀疑自己,要自信一些!(PS : 这个小姐姐好暖,阿粉爱了

朋友 E :希望在大学的时候,自己少在宿舍睡会儿觉,打会儿游戏,多出去走走,多交朋友。一定要积极结交朋友,因为他们可以或多或少带给你快乐,在未来的生活里朋友是非常重要的一个存在,很多事情都可以帮到你,真的到那个时候,你会无比的庆幸自己有好朋友在身边陪伴着自己

朋友 F :如果时间可以倒流,我想回到高中,跟我的老班道个歉,谢谢她当时是一直为我考虑,当时自己太年少轻狂了,根本没有把她的话放在心上,反而以为是老班想要放弃我这个学生了,处处和她顶撞,说那么难听的话。当时如果能够站在她的角度去想想…现在想要和她道个歉,都已经联系不到她了,特别遗憾

朋友 G : 如果时间可以倒流么?我就回到母亲的子宫里,脐带绕颈三圈勒死我自己,哈哈哈,阿粉你肯定没想到我会这样回答

朋友 G 是个调皮鬼,平时就是段子频出,问他的时候他给我这个回答,真是让我惊呆了,脑回路总是这么清奇

其实阿粉对于这个问题也是认真的想了想,阿粉也有想要回去的时候,比如阿粉小的时候,一家人在冬天围着火炉,边取暖边和父母说笑,现在一年可能也就过年的时候回去;比如阿粉做错事惹母亲生气的时候;但是怎么可能会回去呢

只是当我们有这么念头的时候,肯定是当时是哪里自己没有做好,所以想要回去,尽自己的努力去做的更好一些

过去的已经过去,已经是抓不住的了,其实我们不如将那份心情和遗憾,放在未来,尽全力去做好当下的事情,去抓住未来。

故事还长,不要失望~

阅读全文 »

SpringBoot 项目接入 Redis 集群

发表于 2020-09-21 | 分类于 Java

Hello 大家好,我是鸭血粉丝,Redis 想必大家一定不会陌生,平常工作中或多或少都会用到,不管是用来存储登录信息还是用来缓存热点数据,对我们来说都是很有帮助的。但是 Redis 的集群估计并不是每个人都会用到,因为很多业务场景或者系统都是一些简单的管理系统,并不会需要用到 Redis 的集群环境。

阿粉之前也是这样,项目中用的的 Redis 是个单机环境,但是最近随着终端量的上升,慢慢的发现单机已经快支撑不住的,所以思考再三决定将 Redis 的环境升级成集群。下面阿粉给大家介绍一下在升级的过程中项目中需要调整的地方,这篇文章不涉及集群的搭建和配置,感兴趣的同学自行搜索。

阅读全文 »
1 … 7 8 9 … 31
Java Geek Tech

Java Geek Tech

一群热爱 Java 的技术人

610 日志
116 分类
24 作者
RSS
GitHub 知乎
Links
  • 纯洁的微笑
  • 沉默王二
  • 子悠
  • 江南一点雨
  • 炸鸡可乐
  • 郑璐璐
  • 程序通事
  • 懿
© 2019 - 2022 Java Geek Tech
由 Jekyll 强力驱动
主题 - NexT.Mist