Spring Boot教程(18) – 管理日志

日志用来记录你程序运行的中的一些关键信息,方便你调试以及后期上线的时候查找问题。典型的用法就是应用出现5xx错误了之后,上日志里找找哪里抛出了异常,异常调用栈是什么。

混乱的日志框架

其实Java语言本身有着一套日志工具,在java.util.logging包下,简称JUL。JUL大家好像不怎么用,易用性不行,性能也没跟得上。大家都用Log4j,使用得也比较广泛,本身属于Apache软件基金会(ASF)。Log4j的作者Ceki后来搞了个Logback,弥补了Log4j的缺点。ASF后来也把Log4j升级成了Log4j2,前者于15年停止更新,后者对于Logback和Log4j也是取其精华,弃之糟粕(PS:Ceki和ASF绝对有过节)。所以目前可用的日志实现也就是JUL、Log4j2和Logback

(更多…)

继续阅读 →

他就是这种人

一年多前装修的时候,我对自己的项目经理十分不满意,因为他做事情总是稀里糊涂的,给人的感觉非常不靠谱。比如约定时间查看施工进度,从来没有准时到达的;比如我想更换开关面板颜色,他却说暖风和排气功率大,不能换;比如搞了个劣质龙头,导致水漫到阳台和卧室,等等,现在回想起来还有好多。

有的时候我就想,这人怎么想的,自己难道不知道迟到的时候业主会有意见么?撒谎说高架限行,难道不知道高架下的路也可以走么?上面说到我想更换开关面板,我把开关还有暖风排气的各种参数列出来算给他看,他却支支吾吾骗我说他给厂家打过电话,对方表示不能换。后来我给厂家打电话,对方电工过来,1个小时就弄好了。我很疑惑,他自己到底有没有仔细想过我说的话,提出的需求等等。

(更多…)

继续阅读 →

Spring Boot教程(17) – 快速理解AOP

AOP,Aspect-oriented Programming,面向切面编程,是你接触Spring之后比较难理解的概念。网上也有很多文章来介绍它,但是我老是看不懂,上来就一堆术语,头大。在我详细解释AOP之前,先用一句话说明他的典型用法:

把对象修改一下或者包装起来,在它方法执行的前后,额外运行点代码

很多时候你不知不觉就使用了AOP:在@Component类中,你在方法上加了@Transactional注解之后,方法执行前会开始事务,方法执行之后结束事务,方法发生异常之后回退事务;加上@Async注解之后,方法最终被调用的时候是异步的;加上@Cacheable注解之后,方法的返回值会被缓存起来,下次调用的时候直接返回缓存值。这些都是框架提供给你的,你只要加个注解声明一下就能用。

同时你也可以编写AOP代码来实现自己需求,比如在方法执行之前开始计时,在方法结束之后停止计时,来得到方法的运行时间;比如在业务的关键地方加上log;比如权限控制、懒加载等等。使用AOP的特点就是侵入性比较小,你的业务代码不用动,降低耦合度,方便团队分工。

(更多…)

继续阅读 →

Spring Boot教程(16) – 属性配置

Spring Boot的特点就是自动配置,开箱即用。它按照业界一些常见的做法去配置项目,如果你代码跑起来之后,感觉够用了,就不用再操心。如果感觉不够用,就需要自己定义一些属性来满足你的需求。使用Spring Initializr或者IDE创建项目之后,在src/main/resources目录下会有个application.properties文件,它就是用来保存你的自定义配置的,每条配置使用”key=value”的形式,大概长这样:

相信你肯定用过了,网上各种教程基本开头都会教你配置一些常见的属性,Spring Boot文档也列出了大部分的属性以及其默认值,我就不再赘述了。这次我们聊点别的。

(更多…)

继续阅读 →

Spring Boot教程(15) – 使用WebSocket

WebSocket是一种网络通讯协议,一个TCP连接的两端,可以同时给对方发送消息,即支持全双工通信。比较常见的应用场景就是服务端给客户端推送信息,相对于轮询,WebSocket减少了宽带资源浪费,实时性更强。

WebSocket利用了HTTP协议,建立连接之后,会先发一个特殊的HTTP请求过去,服务器发现这是个WebSocket的请求之后,就按照协议要求返回一个特殊的HTTP响应,告诉客户端“我知道你想用WebSocket了,我们按照它的协议来工作吧”。然后TCP链接就不会断开了,留着发消息。所以说WebSocket只利用你原来的80端口(ws://)和443端口(wss://)就可以工作,不需要再开个端口。

(更多…)

继续阅读 →

Spring Boot教程(14) – 跨域访问

前两天,看了看前端小伙伴的代码,发现他在访问API的时候,并不是直接访问API域名的,而是访问前端域名下的/api路径,然后在部署的服务器上,用nginx把/api路径的请求,转发到API域名那里。我感觉很奇怪,为什么要这样做?本来可以直接访问的东西,为啥还要再绕一圈?

(更多…)

继续阅读 →

使用frp将服务器请求转发到本地

如果你对接过国内的一些开放平台,比如微信(公众号、小程序)、支付宝什么的,你会发现在开发阶段就需要一个公网地址来提供API或者接收回调,你总不能搞个服务器,开发一点,部署一点吧。今天我们介绍一个方法,将服务器的请求,转发到你的开发机上,这样不管是修改代码、查看日志还是跟踪调试,都会很方便。

(更多…)

继续阅读 →

Spring Boot教程(12) – 编写JSON API

目前很多公司开发项目,都选择了前后端分离的方式,不仅仅因为前端现在有丰富的生态和活跃的社区,更是因为分离让前端和后端的耦合度大大降低。前后端开发人员各司其职,各自做擅长的事情,提高了团队效率。而现在在电脑前学Spring Boot的你,很可能在将来的工作中扮演后端API开发的角色。

前端和后端的数据交换格式,现在用的最广泛的是JSON,Spring Boot的Web Starter也自带了JSON的支持,而且选用了Jackson库,我之前也写过它如何使用,阅读本文之前最好看一看。另外,还有个JSON库叫Gson,使用也比较广泛,加入了Gson的依赖之后,可以通过配置将其作为默认的JSON库。

对于前后端一体的应用,请求处理处理方法会返回模板的名字用来生成页面。而写接口的话,就需要在方法上添加@ResponseBody注解。你返回一个字符串,请求接口就会得到一个字符串。

(更多…)

继续阅读 →

终于接到了第一个单子

我是在今年初的时候转行到Java Web开发的,3月份有朋友找到我问做外包不,正好那时我正愁接不到活而且也有转到Java后端的想法,就同意了。没想到toB的生意这么熬人,直到前两天才定了下来,现在刚刚开始开发。昨天刚在某个知识星球还是公众号上看到,toB的业务从开始接触到最终签订合同要3到6个月,我算是初步体验了下。

这几个月我当然没有干等着,就把Spring Boot给学了学,同时也写了十几篇相关的文章,先发到博客,再同步到公众号,再同步到知乎。博客上的文章的确是吸引了一些自然搜索流量,不多不过应该会挺持久的。知乎上很意外,平均每篇有三四百个阅读,评论点赞收藏数量也不少,给我一种东西没白写的感觉。公众号的阅读是最惨的,纯技术文的阅读量是其他文章的十分之一,过了两天之后,就相当于沉没了。现在考虑公众号上只发一些闲聊、观点、讲个人经历的内容。

再回来说说项目,我是给苏州一个制造业企业做内部工具。牵扯到后端,前端,安卓和小程序,难度不大就是挺麻烦。考验我水平是否过关的时候到来了,我在知乎上的专栏名叫《JavaWeb实践之路》,其实现在才算真正开始实践。

我也不算是单打独斗,我只写后端,其他的交给了一起搞事的小伙伴,虽然我都会一点,但是专业的事还是交给专业的人去做,分工协作出成果。目前还缺个小程序开发,如果你正好有兴趣,可以加我微信(公众号菜单有),这次合作不成,下个项目说不定可以。

接下来一段时间可能不太会更新文章了,等项目做完,我会给大家同步在这个过程中遇到的一些困难和总结出来的经验,同时技术水平应该能再涨一涨,我好继续写我的Spring Boot教程系列。

继续阅读 →