Introspection: Who am I? where am I? What am I going to do?

Spring源码剖析 - ApplicationContext

前言

实话说,Spring虽火,但我的使用经验却不多。这和我的实际工作经历有一定关系,前几年初入软件这行,项目使用Struts1,第一次使用Spring,还是在同时期的外快项目,非常表面。换公司后直接转向Vertx技术栈,近一年多虽然又转向Spring,但手上的Spring项目并不复杂,也没抽时间好好过一遍Spring。于是,Spring成了心病,你可以说它千万好坏,但首先得掌握它,这一点我做的不好,所以是时候研究一下它。

Spring说简单也简单,本质上就一个依赖注入、面向切面的框架;Spring MVC也只是针对Web应用场景的抽象,会定义Controller、Servier、Repository就会用;Spring Boot就是一个快捷启动方式。说复杂也复杂,Spring太大了,人们常说Spring上手容易,精通难,没错,但有点废话,我印象中没有几门技术精通起来是容易的。

Spring的大,一是体现在功能的全面,同一件事提供多种处理方式,对老手是利器,对新手就抓瞎;二是体现在源码上,Spring的源码很大,抽象层次很多:比如BeanFactory有ConfiurableBeanFactory、HierarchicalBeanFactory等抽象,ApplicationContext也有很多。基础知识涉及也较多:如果要了解Spring Web的工作配置原理,首先要了解Servlet规范;要了解AOP,首先要了解JDK动态代理、CGLib的区别,最好还了解一下ASM,因为Spring读取Bean时也有用到;要了解资源国际化,你首先要了解JDK提供的ResourceBundle;三也体现在手册上,Spring的手册写得很好,但是很长,有尝试过通过读手册来学习Spring,但手册大而全,没有重点,不会讲原理,用的时候翻翻还行,深入探究就不管用了。

阅读此文
post @ 2021-11-03

动态代理说大不大,说小不小,可深可浅。往深了说还是对JVM的了解程度要足够深入,时间篇幅有限,本文专注于回答如下问题,不作更深入的探讨。

  • JDK和Cglib动态代理,分别怎么使用
  • JDK动态代理的原理
  • Cglib动态代理的原理
  • 为什么JDK动态代理一定要实现接口,而Cglib就不用?
  • JDK和Cglib,本质上有什么区别?
阅读此文
post @ 2021-10-21

我会写Java反射,我知道反射是用来获取、改变程序运行时状态的方式,通过反射API我们能够获取类对象、类的方法、成员变量、注解等。

我不会写Java反射,我不知道Type和Class有啥关系,ParameteredType、TypeVariable呢?

我会Java反射吗?不,我不会。

阅读此文
post @ 2021-10-20

站在巨人的肩膀上,JMH是一个工具,不打算深入研究它,只求能够正确使用,网上关于它的使用方法讲的还挺全面的,就直接看他们吧。

这篇文章包含基本使用方法、注意事项、IEAD插件、JMH可视化工具的介绍等:性能调优必备利器之 JMH

这篇文章包含较为深层次的解释:JAVA拾遗 — JMH与8个代码陷阱

当然最重要的还有官方例程:JMH给的38个例子

作为补充,我添加了所有注解的说明,还有自己使用中遇到的问题

阅读此文
post @ 2021-10-18

序列化探索之Protobuf

Protobuf是谷歌提出的一种高压缩比的序列化格式,二进制,不可读,语言无关,平台无关。拥有自己的语法规则,压缩编码算法,并提供主流语言的API生成器(即Protobuf编译器),其序列化结果很小,能够有效节省带宽。

掌握Protobuf,需要比较了解三个方面,其中,如果只是单纯滴使用,前两个方面即可。

  • proto语法规则,即proto文件的语法规则
  • 具体语言的API生成及使用规则,即通过proto文件生成对应语言的代码
  • 序列化和反序列化算法
阅读此文
post @ 2021-10-16

Gson是一个相对简单的库,没有那么多功能,从设计上也并不想让别人去扩展它,它只想安安静静地做一个Json序列化库,简单而实用。

阅读此文
post @ 2021-10-15

开局一吐槽,Fastjson的文档,比Jackson还差。Jackson只是位置不明确,如果安下心来看看,还是能够理清楚的。而Fastjson是位置不明确,如果安下心来看看,还会发现,它的文档零零散散,中英文混杂,找不准主线在哪儿。我记得知乎上有个问题,fastjson这么快老外为啥还是热衷 jackson?,就这文档,让老外用个啥。

不过看还是要看的,毕竟它是目前主流序列化框架之一。老样子,我们还是从基本使用方法和原理分析两部分着手。

阅读此文
post @ 2021-10-14

写这篇文章时,我一度陷入了纠结与不安,再次体会到了聚焦的重要性。Jackson看似简单,实则功能强大,这两天有些迷失,不知道要看些什么,要写些什么。但路得一步一步走,饭得一口一口吃,纵使它可供探索的点繁如星辰,我也得将焦点拉回,否则就叫失控。至于其它的点,以后再说。因此,本文将聚焦如下几点

  • Jackson的能力
  • 基本原理
  • module工作原理
阅读此文
post @ 2021-10-09

文章不长,但代码演示居多,可选择性阅读

Kotlin以扩展包的形式提供了序列化能力,使得能够以“Kotlin方式”进行序列化。Kotlin设计目标,是提供一个序列化抽象,具体格式实现可用Json、CBOR、Protobuf、Properties、Yaml等进行替换。但就目前的进度,仅提供了对Json的稳定支持。其它格式都处于试验阶段。

因此,我们看Kotlin的序列化,主要看的就是数据对象与Json之间的序列化和反序列化。

阅读此文
post @ 2021-10-06

序列化和反序列化,渗透在日常开发的方方面面。

所谓的序列化,就是将数据转换为能够在网络上传输、在数据库中存储、在文件中持久化的格式,这类格式很多,可以是字节流(如Java自带的序列化机制)、可以是JSON(系统之间传输用的较多)、可以是Protocol Buffers(压缩率高,GRPC有用)。反序列化,即序列化的反过程。

序列化这件事,不同的语言、库,提供了不同的使用方法,哪怕是对同一种序列化格式的支持也有差别。因此,深入了解常用的序列化技术,很有必要。不要再去记使用方法了,我们来看原理吧。

阅读此文
post @ 2021-10-04

这是系列文章

  • 设计模式 - 理论(本文)
  • 设计模式 - JDK
  • 设计模式 - Spring
阅读此文
post @ 2021-09-30

UUID,Universal Unique Identifier,全局唯一标识符。也叫做GUID,Global Unique Identifier。

概念都了解,全局唯一嘛,但怎么实现的?多大概率重复?JDK的UUID和PostgreSQL的UUID一样吗?带着这些问题,我们从RFC,到JDK源码、PG手册,一点点看。

本文包含以下内容:

阅读此文
post @ 2021-09-28

震惊,查询SQL的创建居然是根据Repository的方法名来生成的。

对于JPA,我们只需要掌握几点。

阅读此文
post @ 2021-09-27

本文,我们主要聊一下Java中缓存的使用,几个点

  • Java对缓存的抽象——JSR107
  • Spring对缓存的抽象——Spring Cache
  • Redis如何集成到Spring中——作为Spring Cache的实现、直接使用RedisCache、使用RedisTemplate
阅读此文

背景

现有使用Spring WebSocket库搭建的STOMP通知中心,使用Spring自带功能,能够区分到用户,向来自同一用户的多个连接(会话)广播数据。

这正是我们的使用场景:当用户调用服务端指定接口时,服务端向该用户所在的所有用户发送通知。

现有的配置,在WebSocket握手阶段验证TOKEN,解析成用户ID,存入WebSession;在接口访问时带上TOKEN,再通过SimpMessagingTemplate.convertAndSendToUser()向该用户进行广播。

阅读此文
⬆︎TOP