2021

前几日 Java 16 发布了,发现还是有童鞋不太了解Java目前的版本机制,所以看到了这样的留言: 那么为什么大家都还在用 Java 8 呢? 从这张图可以一目了然,大家平时最喜欢的是什么?当然是白嫖啦~ 而从JDK 8u211开始往后的版本,可都是需要商业收费的,所谓的商业收费,就是你自己开发程序使用不打紧,但是一旦当你开发的程序如果用于商业用途,也就是你的程序给你赚钱了,那此时此刻Oracle可是要跟你收费的,你的JDK的使用需要缴费获得授权才是合法的。 有的人会问,如果我不缴费直接用呢?当然,Oracle也是不知道这个事情的,天底下那么多程序员他不可能每个都时刻紧盯有没有付费。 不过万一你真的有那么点才华,你的产品越做越大,越被人熟知的话,总有一天树大招风会引起Oracle的注意,指不定哪天就来跟你打打知识产权的官司。毕竟这是Oracle的惯用手法了,小编毕业前在某视频网...

Spring Boot 2.4.4 已经发布。现在可从 repo.spring.io 和 Maven Central 获得。 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.4</version> <relativePath/></parent> 这是 v2.4 版本的第四个错误修正版本,包括 60 个错误修复,增强功能,文档改进和依赖项升级。 Bug Fixes 使用 jOOQ 当 SQLException 无法翻译时,会抛出 NPE 如果配置了多个 schema 或数据脚本加载路径...

昨晚睡觉前,顺手撸了几个群聊的聊天记录。发现一个很有意思的名词“分布式单体”,顺藤摸瓜看了一下之前的聊天记录,由于内容骂骂咧咧,我就不贴出来了。。。大致内容就是某公司在做微服务改造,但改的不伦不类,形式上像微服务,而本质上依然是单体,甚至连单体都不如。 这样的改造现象,其实在国内还是蛮多见的。下面就来聊聊这个有趣的话题:分布式单体。各位看官,看看你们公司是不是也犯了这样的错误? 分布式单体为什么不好先思考一个问题:从单体改造到微服务的时候,你们是不是按这样的步骤来的? 确定业务领域,拆分存储,定义各微服务的边界 改造代码逻辑,将原来的内部service调用改成dubbo或feign这样的远程调用 通过这样的改造,我们得到了很多好处,比如: 代码库分开了,减少了麻烦的解决代码冲突的困扰 CI/CD分开了,每个拆分后的服务都可以独立开发、部署、运行 数据库分开了,独立运行,不同业务...

前段时间因为团队调整,大部分时间放在了团队上,这系列的更新又耽误了一下。但既然承诺持久更新,那就不会落下,今天开始继续更新这部分的内容! 过了年,重申一下这个系列的目标:目前主要任务就是把Spring Boot 1.x部分没有升级的内容做完升级。我会将因为版本升级而产生的变化做一些说明,这样不论低版本的读者还是高版本的读者都能找到自己想要的部分。这也是这次做2.x版本升级的重要原因,尽量避免或减少有读者用着高版本参考我这边低版本的实现而出现问题,然后开始问候我家人的情况。 在完成上述所有的更新之后,接下来很重要的更新内容将会集中在关于Spring Boot的一些进阶内容,比如:要做什么扩展的时候,该从哪里着手等。 如果是您是Spring Boot的使用者,那么一定要关注一下!后面的内容会越来越精彩! 下面回归今天的主题,如何在Spring Boot中使用MongoDB! MongoD...

又到了春节后的跳槽旺季,之前在知乎上有这样一个话题为什么说银行科技岗是程序员好的就业选择?。 之前做的回答最近又是每天好几万的阅读,看来对于银行科技这样的围城还是有很多人好奇的。趁这个机会,转到这边跟大家聊聊我四年银行科技生涯的感悟吧! 我从研究生毕业,第一份工作就去了工行,一干就是四年,体会比较深。所以给大家谈谈,我对银行科技岗的直观感受,给目前在纠结要不要去银行或者有考虑去银行的读者们一些参考: 1、领导不会管你的专业、爱好、特长,反正哪里缺人,你就上吧。本人本科软件工程,硕士数据挖掘。一开始入行被分配到测试,好几个985的研究生几天就自己走了。2、关系户多,如果没什么关系的话,比较容易到上升瓶颈。同时,很多关系户几乎不太做事,但是工作量在那边,所以没关系的事情会多一些。3、技术体系陈旧,还有公司自己封闭的轮子,技术成长机会很小,未来往技术方向走的路线会很难。但是同业间还是有很多...

当看到你提供的接口,有这样的服务消费方,你会做何感想? try { // 前置业务逻辑 // 调用DD的接口处理 feignClient.execute();} catch(Exception e) { return "DD的接口异常,请关注公众号「程序猿DD」,联系作者处理异常";} 作为一位开发老鸟,理性解析下这样做法的问题: 在调用第三方接口的时候,可能出现问题的原因有很多,并不一定是第三方接口的问题,比如:网络出现了问题,请求根本没有到达服务提供方。所以这样的异常返回是不合理的。 由于异常快中,完全没有输出异常栈的内容,导致异常信息被吞,未来就很难定位错误原因,容易陷入两边推诿的情况。 用户并不关心开发负责人是谁,异常应该更面向用户。使用用户看得懂异常描述信息,更为合理。 同时提醒一下,作为服务提供方,更要最...

还记不记得求学时代各种复杂的数学公式?sin、log2、tan等等等,是不是看到这就觉得算起来麻烦? 通过MXReflection框架,你可以使用Java计算这些曾经我们觉得无比复杂的数学运算和函数,只需使用与类相关的字段。 MXReflection可以从指定字段读取值,并将结果注入@Expression注释字段。 <dependency> <groupId>com.github.ismail-mekni</groupId> <artifactId>mxreflection</artifactId> <version>1.0.1</version></dependency> 那如何使用这个框架呢? 很简单,只需要两个java注释。 1、通过@Arg值,我们可以指定要在目标...

新年上班第一天,Spring Boot 就发布了最新的2.4.3 、2.3.9 版本。心急的小伙伴现在可从 repo.spring.io 和 Maven Central 获得相关内容。 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.3</version> <relativePath/></parent> Spring Boot 2.4.3版本是v2.4 版本的第三个错误修正版本,本次更新内容包括了 29 个错误修复,15个文档改进和31个依赖项升级,共计75项内容,不可谓不丰富。 下...

今天为大家带来一个很有趣的游戏模拟器GoBoy GoBoyGoBoy是一个可以在多平台运行的任天堂GameBoy和GameBoy Color的模拟器,目前这个模拟器可以运行大多数的GameBoy游戏和一部分GameBoy Color的游戏。同时还有声音和颜色的支持,是不是很多80后小时候偷偷玩GameBoy的回忆涌上心头了? 这个模拟器是作者当初作为一个开发练习用的项目,目前仍然在不断更新中。 模拟器包含了调试函数,便于使用者理解该如何使用操作这个模拟器,方便自己个性化的写一个类似的模拟器出来。 这些调试函数会将每一步的操作码及数值打到控制台显示,不过这个可是会降低模拟器速度的哟。 是不是很心动?赶紧来看下具体怎么弄! 如何安装想知道怎么用吗?首先我们要去github上下载一个最新版本的GoBoy,地址如下: https://github.com/Humpheh/goboy/re...

最近疫情又开始紧张起来,一个做智能设备的张同学问我,他们的客户想在打卡的地方检查员工是否有戴口罩进出,记得我之前分享过一个开源的框架,发给他看看。过了2天,他又来找我:你这推荐的什么鬼开源,一点都不准,太不给力了,还有其他方法可以快速集成的么? 凭着技术人的快速搜索能力,我发现了一个不错的好东东:百度EasyDL。特地拿出来给大家推荐这个工具不仅是因为通过它,帮助朋友解决了问题,同时还给了自己一些新的启发,或许后续有啥想法还能用这个折腾点东西,赚赚钱!而且,我觉得EasyDL最大的魅力在于对开发者的技能并不那么挑,大部分人都可以快速上手,并可能利用它给自己带来收益! 下面我就分三部分给大家介绍一下,以及我们可以用它来做啥: 啥是EasyDL? 初步尝试 进一步思考 百度EasyDL简介啥是百度EasyDL?在介绍我的尝试之前,我们先了解一下它的背景。 百度EasyDL是基于飞桨开...

在一个Spring Boot项目中,连接多个数据源还是比较常见的。之前也介绍了如何在几种常用框架的场景下配置多数据源,具体可见: Spring Boot 2.x基础教程:JdbcTemplate的多数据源配置 Spring Boot 2.x基础教程:Spring Data JPA的多数据源配置 Spring Boot 2.x基础教程:MyBatis的多数据源配置 当我们采用多数据源的时候,同时也会出现一个这样的特殊场景:我们希望对A数据源的更新和B数据源的更新具备事务性。这样的例子很常见,比如:在订单库中创建一条订单记录,同时还需要在商品库中扣减商品库存。如果库存扣减失败,那么我们希望订单创建也能够回滚。 如果这两条数据在一个数据库中,那么通过之前介绍的事务管理就能轻松解决了。但是,当这两个操作位于不同的数据库中,那么就无法实现了。 本文就来介绍一种解决这类问题的方法:JTA事务...

我们一直强调,要写注释,要写文档!写出一份好文档是一个开发者应该具备的一项重要能力! 今天在群里(点击加入),看到一个经典的来自某国企的接口文档,引发了一段时间的讨论。 在这个文档中,HTTP接口的内容格式大致是这样的: 聪明的你,有发现什么不妥么? 这样的文档群友们打了0分,你觉得可以得几分呢? 说说我的看法 作为API请求,没有给出请求类型(GET、POST…)的说明 没有给出请求格式(表单?JSON?)的说明 请求参数没有参数类型、参数格式以及合法校验的规则说明 请求响应格式的说明 请求异常响应的格式说明 就说这么说吧,换你思考了,想想看是否还有其他的问题呢?点击这里来评论区说出你的想法吧! 或者想看看其他群友的想法,点击这里直达!

前段日子在社群(点击加入)里看到有人讨论关于Service层接口的问题,DD也经常碰到周围的新人有问过一些类似的问题:一定要写个Service层的接口吗?Service层的接口到底用做什么用的呢?好像都没什么用啊? 我的看法Service层在业务逻辑不复杂的时候,似乎是没有什么用,但是随着应用迭代,业务逻辑变得复杂了之后,这一层是非常有用的。 主要表现在这几个方面: 1、更适合用来处理复杂的业务逻辑,可能会涉及多张表的操作,甚至还混杂着消息投递、接口调用等一系列的复杂综合性事务,这也是我们常说的事务管理所处的层次。 2、对表现层的复用支持,往往我们一个业务逻辑处理,不会单单只应用在一个API接口或页面上,如果直接把这部分内容写到Controller中,那当出现重复操作的时候就会产生复制黏贴,以后再要维护这段逻辑就麻烦了 3、对单元测试的支持,通过单独的一层service实现业务逻辑,...

当我们使用Spring Initializr来创建Spring Boot工程的时候,有没有发现在工程根目录下有两个名为mvnw的文件: 从命名、图标、扩展名来猜测,这两个文件的作用应该是一样的,只是cmd文件应该是用在windows下跑的,而另外一个则是用于linux环境下跑的。 那么这个文件到底是用来做什么呢?下面我们一起尝试了解一下: 第一步:打开读一下 因为内容较多,我这里就不放出来了。内容也非常易懂,只要你了解shell和maven,就能知道这个脚本主要做这几件事: 检测你是否有安装Maven,如果没有,就自动下载一个(这样才能完成后续的构建任务) 检查你是否有安装Java或者配置是否正确,这个无法自己完成,如果报错了,就要自己处理一下,比如JAVA_HOME没有,那就自己配置下。 检查否存在版本不兼容的情况,如果不兼容他会下载合适的版本来帮助你完成构建 更多检查的...

在使用Spring Boot开发应用的时候,你是否有发现这样的情况:自定义属性是有高量背景的,鼠标放上去,有一个Cannot resolve configuration property的配置警告。 如果不对于这个警告觉得烦,想要去掉,那么可以通过设置来去除: 但是,我的建议是不要去掉,因为这个警告正好可以通过高亮来区分你的自定义配置以及框架配置,可以让你快速的分辨哪些是自定义的。 如果你实在想去掉,那么也不建议用上面说的方法,而是建议通过完善配置元数据的方式来完成。所以,今天就来具体说说配置元数据的应用! 啥是配置元数据?我们不妨打开一个已经创建好的Spring Boot项目,查看一下它的Spring Boot依赖包,可以找到如下图的一个json文件: 这里报错的就是配置的元数据信息。有没有发现这些name的值都很熟悉?其中description是不是也很熟悉?对,这些就是我...