mghio

Java 搬运工 & 终身学习者。


  • 首页

  • 标签

  • 分类

  • 归档

  • 关于

  • 搜索

如何实现一个简易版的 Spring - 如何实现 Setter 注入

发表于 2020-11-28 | 分类于 Java , Spring |
字数统计: 2.9k 字 | 阅读时长 ≈ 12 分钟

前言

之前在 上篇 提到过会实现一个简易版的 IoC 和 AOP,今天它终于来了。。。相信对于使用 Java 开发语言的朋友们都使用过或者听说过 Spring 这个开发框架,绝大部分的企业级开发中都离不开它,通过 官网 可以了解到其生态非常庞大,针对不同方面的开发提供了一些解决方案,可以说 Spring 框架的诞生是对 Java 开发人员的一大福利,自 2004 年发布以来,Spring 为了解决一些企业开发中的痛点先后引入了很多的特性和功能,其中最重要的就是我们经常听到的 IoC 和 AOP 特性,由于涉及到的知识和细节比较多,会分为几篇文章来介绍,今天这篇(也是第一篇)我们来看看如何实现基于 XML 配置方式的 Setter 注入。

阅读全文 »

Spring 是如何造出一个 Bean 的

发表于 2020-10-08 | 分类于 Spring , Java |
字数统计: 1.3k 字 | 阅读时长 ≈ 5 分钟

前言

使用 Java 作为第一开发语言的朋友们,相信大家或多或少的都使用过 Spring 这个开发框架,可以说 Spring 框架真是我们 Java 程序员的春天,在 Spring 中 Bean 是其中最重要的概念之一,是学习其它高级知识的基础,Bean 本质上其实就是一个被 Spring 框架管理的对象,今天我们来看看 Bean 在 Spring 中是如何被造出来的。

阅读全文 »

从 CPU 缓存看缓存的套路

发表于 2020-09-24 | 分类于 Java , 缓存 |
字数统计: 2.4k 字 | 阅读时长 ≈ 8 分钟

一、前言

不同存储技术的访问时间差异很大,从 计算机层次结构 可知,通常情况下,从高层往底层走,存储设备变得更慢、更便宜同时体积也会更大,CPU 和内存之间的速度存在着巨大的差异,此时就会想到计算机科学界中一句著名的话:计算机科学的任何一个问题,都可以通过增加一个中间层来解决。

二、引入缓存层

为了解决速度不匹配问题,可以通过引入一个缓存中间层来解决问题,但是也会引入一些新的问题。现代计算机系统中,从硬件到操作系统、再到一些应用程序,绝大部分的设计都用到了著名的局部性原理,局部性通常有如下两种不同的形式:

时间局部性:在一个具有良好的时间局部性的程序当中,被引用过一次的内存位置,在将来一个不久的时间内很可能会被再次引用到。

空间局部性:在一个具有良好的空间局部性的程序当中,一个内存位置被引用了一次,那么在不久的时间内很可能会引用附近的位置。

阅读全文 »

Java 集合类 List 的那些坑

发表于 2020-08-23 | 分类于 Java , List |
字数统计: 951 字 | 阅读时长 ≈ 3 分钟

现在的一些高级编程语言都会提供各种开箱即用的数据结构的实现,像 Java 编程语言的集合框架中就提供了各种实现,集合类包含 Map 和 Collection 两个大类,其中 Collection 下面的 List 列表是我们经常使用的集合类之一,很多的业务代码都离不开它,今天就来看看 List 列表的一些坑。

第一个坑:Arrays.asList 方法返回的 List 不支持增加、删除操作

例如我们执行以下代码:

1
2
List<String> strings = Arrays.asList("m", "g");
strings.add("h");
阅读全文 »

RabbitMQ 基础概念进阶

发表于 2020-08-09 | 分类于 RabbitMQ , Java |
字数统计: 3k 字 | 阅读时长 ≈ 10 分钟

上一篇 RabbitMQ 入门之基础概念 介绍了 RabbitMQ 的一些基础概念,本文再来介绍其中的一些细节和其它的进阶的概念。

消息生产者发送的消息不可达时如何处理

RabbitMQ 提供了消息在传递过程中无法发送到一个队列(比如根据自己的类型和路由键没有找到匹配的队列)时将消息回传给消息发送方的功能,使用 RabbitMQ 的客户端提供 channel.basicPublish 方法的两个参数 mandatory 和 immediate (RabbitMQ 3.0 以下版本),除此之外还提供了一个备份交换器可以将无法发送的消息存储起来处理,不用重新传回给发送方。

阅读全文 »

RabbitMQ 入门之基础概念

发表于 2020-07-18 | 分类于 RabbitMQ , Java |
字数统计: 2.5k 字 | 阅读时长 ≈ 8 分钟

什么是消息队列(MQ)

消息是在不同应用间传递的数据。这里的消息可以非常简单,比如只包含字符串,也可以非常复杂,包含多个嵌套的对象。消息队列(Message Queue)简单来说就是一种应用程序间的通讯方式,消息发送后立即返回,然后由消息系统保证消息的可靠性传输,消息生产者只需要把消息发到 MQ 中就可以了,不需要关心消息的消费,同样,消息消费者只管从 MQ 中拉取消息而不管是谁生产的消息,通过这样的一个“互相不知道对象存在”模式,将消息的生产者和消息的消费者解耦了。

什么场景下考虑使用消息队列

从上面可以知道,消息队列是一种应用间的异步协作机制,那么我们什么时候需要用到 MQ 呢?以常见的订单系统为例,当用户点击「下单」后的业务逻辑可能包括:扣减库存、生成相应订单数据、发短信通知等。在项目和业务发展初期上面这些逻辑可能放在一起执行,随着业务的发展订单量的增加,需要提升系统服务的性能,此时就可以将一些不需要立即生效的操作拆分出来异步执行,比如发送短信通知等。这种场景下就可以使用 MQ ,在下单主流程(比如扣减库存、生成订单数据等)完成之后发送一条消息到 MQ 让主流程快速走完,然后由另外一个线程拉取 MQ 的消息,执行相应的业务逻辑。这里的例子主要是用消息队列来解耦。

阅读全文 »

Java 中队列同步器 AQS(AbstractQueuedSynchronizer)实现原理

发表于 2020-06-13 | 分类于 Java , 并发 , 进阶 |
字数统计: 7.1k 字 | 阅读时长 ≈ 28 分钟

前言

在 Java 中通过 锁 来控制多个线程对共享资源的访问,使用 Java 编程语言开发的朋友都知道,可以通过 synchronized 关键字来实现锁的功能,它可以隐式的获取锁,也就是说我们使用该关键字并不需要去关心锁的获取和释放过程,但是在提供方便的同时也意味着其灵活性的下降。例如,有这样的一个场景,先获取锁 A,然后再获取锁 B,当锁 B 获取到之后,释放锁 A 同时获取锁 C,当获取锁 C 后,再释放锁 B 同时获取锁 D,依次类推,像这种比较复杂的场景,使用 synchronized 关键字就比较难实现了。
在 Java SE 5 之后,新增加了 Lock 接口和一系列的实现类来提供和 synchronized 关键字一样的功能,它需要我们显示的进行锁的获取和释放,除此之外还提供了可响应中断的锁获取操作以及超时获取锁等同步特性。JDK 中提供的 Lock 接口实现类大部分都是聚合一个同步器 AQS 的子类来实现多线程的访问控制的,下面我们看看这个构建锁和其它同步组件的基础框架——队列同步器 AQS(AbstractQueuedSynchronizer)。

阅读全文 »

一文让你快速上手 Mockito 单元测试框架

发表于 2020-05-30 | 分类于 Java , unit test , mockito |
字数统计: 4.1k 字 | 阅读时长 ≈ 17 分钟

前言

在计算机编程中,单元测试是一种软件测试方法,通过该方法可以测试源代码的各个单元功能是否适合使用。为代码编写单元测试有很多好处,包括可以及早的发现代码错误,促进更改,简化集成,方便代码重构以及许多其它功能。使用 Java 语言的朋友应该用过或者听过 Junit 就是用来做单元测试的,那么为什么我们还需要 Mockito 测试框架呢?想象一下这样的一个常见的场景,当前要测试的类依赖于其它一些类对象时,如果用 Junit 来进行单元测试的话,我们就必须手动创建出这些依赖的对象,这其实是个比较麻烦的工作,此时就可以使用 Mockito 测试框架来模拟那些依赖的类,这些被模拟的对象在测试中充当真实对象的虚拟对象或克隆对象,而且 Mockito 同时也提供了方便的测试行为验证。这样就可以让我们更多地去关注当前测试类的逻辑,而不是它所依赖的对象。

阅读全文 »

如何在一台计算机上安装多个 JDK 版本

发表于 2020-05-16 | 分类于 JDK , Java , 版本管理工具 |
字数统计: 1.4k 字 | 阅读时长 ≈ 5 分钟

前言

对于使用 Java 语言开发的朋友可能会遇到这种情况,有时想学习和探索 Java 的最新版本提供的一些新特性,比如 Java 11,但你无法将其安装在自己的计算机上,因为你的团队正在使用比这个旧的版本(我们目前用的 Java 8),你并不想影响目前的项目。或者你目前是在维护和开发多个项目,而这些不同的项目使用的 JDK 版本不一样,比如那些维护的老项目使用的是 JDK 8,而新项目你打算使用比较新的版本 JDK 11,以上这些情况都需要在计算机上安装多个 JDK,并且应该能够在多个版本之间方便快速的切换。今天要介绍的主角 SDKMAN 可以很好的解决上面这种问题,它提供了在同一台计算机上对多个版本的开发工具包管理。需要注意的是:这个工具只适用于类 Unix 的系统(比如:Mac OSX、Linux、Cygwin、Solaris、FreeBSD 等)。

阅读全文 »

看了你就懂的同步与异步、阻塞与非阻塞

发表于 2020-04-26 | 分类于 Java , IO模型 |
字数统计: 1.9k 字 | 阅读时长 ≈ 6 分钟

前言

在网上看到过很多讲有关同步与异步、阻塞与非阻塞的文章,但是很多都是抛出一堆相关定义,看了之后还是云里雾里的,对这几个概念还是不能很好的去区分它们。本文通过通俗易懂的语言和相关例子让你深入理解其本质。

同步与异步

首先我们要明确的是,同步和异步都是针对两个或者两个以上的事物来说的。比如当我们在网上购物看中一件物品,然后去浏览该商品详情的时候,首先页面会先发送一个请求,后台服务器查询对应商品的相关数据,然后前端详情页面才根据返回数据展示该商品的详细信息。而此时你的网速比较差,一个详情页面等了将近一分钟才全部展示完成,这时候你问这个请求是同步还是异步?答案显然是同步请求,它给我们最直观的表现形式就是页面一直显示在加载中,商品的详情页面渲染必须要等待后台服务器返回商品详情数据后才能进行。也就是说下一个操作必须要等待上一个操作完成才能进行,它依赖于上一个操作的返回结果。

阅读全文 »
12…4
mghio

mghio

33 日志
34 分类
30 标签
RSS
GitHub 思否 简书 掘金 Twitter
友情链接
  • Debug 客栈
  • 大笨蛋程序员
  • 气象万千
  • 独特工具箱
  • 小绒毛的足迹
  • xiaojun's blog
  • Https Author
  • 淡白记忆博客
  • Junhua's blog
  • G-lab
  • 木頭
  • OURONGXING
  • IT运维狗
  • 暗语寒飞 blog
  • 天边风
  • TooPub
  • White water
  • Z
  • EINDEX's Blog
  • 土鱼笔记
  • 故事胶片
  • Java 技术驿站
  • 鱼鱼的小站
  • 虎书博客
  • 梁钟霖个人博客
  • 开源netcore
  • Angor
  • ClawHub的博客
  • 13blog
  • zhang0peter的博客
  • crossoverJie
  • 黄泽彬个人站
  • D 的个人博客
  • 荷戟独彷徨
  • 程序员阿淼
© 2019 — 2020 mghio
访客数 人 总访问量 次