在同一个类的两个方法内部互相调用中,如何使 AOP 生效
熟悉 Spring AOP 的都知道,如果同一个类中的两个方法在内部互相调用,那么此时 AOP 是不会生效的,因为 Spring AOP 是通过代理类来实现的,而类内部的方法调用并不会走到代理对象。那么,有没有办法让内部调用的时候也让 AOP 生效呢?万能的 ChatGPT 告诉我,方法是有的,还有好几种。
熟悉 Spring AOP 的都知道,如果同一个类中的两个方法在内部互相调用,那么此时 AOP 是不会生效的,因为 Spring AOP 是通过代理类来实现的,而类内部的方法调用并不会走到代理对象。那么,有没有办法让内部调用的时候也让 AOP 生效呢?万能的 ChatGPT 告诉我,方法是有的,还有好几种。
前两天看到个问题,说在 Java 中,为什么不推荐在代码中直接写字符串值?我一开始能想到的就是代码的可维护性和可读性,但是总觉得这个问题没这么简单,肯定还有 JVM 虚拟机里面的优化。那既然现在大语言模型这么发达,我觉得可以让它给我讲讲。
我们都知道,Docker 和容器化技术让运维有了质的飞跃,从此我们不必再担心软件运行所需的繁杂环境,只需要拉取镜像并运行就可以一步到位部署好软件的运行环境。但是在开发过程中,我们仍然需要在本机安装各种依赖,一不小心又会把本机的环境搞乱掉,更不提不同版本的语言之间可能存在的冲突。因此,就出现了 Dev Container,顾名思义就是在容器环境中开发,这样我们在开发时也可以享受到统一且隔离的开发环境。
正好我最近也在开始接触 Dev Container 并使用它给一个开源项目成功提交了代码,正好趁热打铁,把写博客的 Hexo 环境从本机挪到 Dev Container 中。
刚刚看到我虚拟机里面的 Ubuntu 报硬盘空间不足,看了下发现是在安装那会,自动分区就只用了一半的空间,遂着手扩容。在这里记录下操作过程备忘。
刚刚登录到我的服务器之后,看到 motd 提示有一个僵尸进程。本来处理僵尸进程很简单,杀掉它的父进程就行了。但是紧接着我发现这个进程是属于一个 Docker 容器的,因为我想要更优雅地处理掉它,就顺藤摸瓜找到了对应的容器并将其重启了。这里就记录下我的排查过程以供参考。
最近在试着用 TypeScript 写点东西,在用 catch (error) {}
代码块处理异常的时候,看到了一个很难理解的错误 TS18046: error is of type unknown
。网上一顿冲浪之后,看到了 Kent C. Dodds 的一篇博客 Get a catch block error message with TypeScript。我跟着文章的内容成功解决了这个问题,并且解答了我的疑惑,所以想要翻译出来帮助到更多的人。
以下内容除特别注明外,皆翻译自原文。我亦不对内容做任何的担保,并不对任何可能产生的后果(包括但不限于文件丢失或功能异常)负责。
前些天在 Atlassian 的文档中看到一篇关于管理点文件(即.bashrc
之类以点开头的文件)的文章《Dotfiles: Best way to store in a bare git repository》,感觉很有参考价值,遂决定翻译出来,希望能帮到更多的人。
以下内容除特别注明外,皆翻译自原文。我亦不对内容做任何的担保,并不对任何可能产生的后果(包括但不限于文件丢失)负责。
今天看到一篇推文说 Homebrew 也支持类似 package.json
的方式来管理电脑上安装的应用,感觉这玩意挺实用的,像我上回换电脑还是照着 brew list
的输出再一个个装,有了它的话就可以一键安装了。而且除了 Homebrew 之外,它还可以导出通过 App Store 安装的软件和 VS Code 插件。那么,就小小折腾一下。
最近项目里用到了些 Lock,爬了些文了解到它们是基于 AbstractQueuedSynchronizer
(即 AQS
)实现的。那么,不如趁热打铁,看看里面是怎么工作的。
在前一篇博文 Spring Boot 启动流程分析的调用 beanFactory 的后置处理
小节中提到了 beanFactory 的后置处理。这部分是 Spring IoC 的重点,但是因为内容很长,所以在这里单独开一篇博文来分析。