阅读提示:TL;DR。文章包含大量源码,阅读时长较长,认真阅读可能超过20分钟。
回想一下,Spring最最核心的功能,终究是一个容器,用于提供所谓的”Bean
“,并负责Bean
之间的联结。而我们又知道,Bean
有不同的Scope
,即作用范围,单例的、原型的、Session
的,或自定义的。Bean
还能够懒加载。因此,创建Bean
的时机可能是运行时的任何时候。Spring使用BeanDefinition
描述一个Bean
的name、类、scope等元数据,并在需要时候创建。创建过程自然也包括了自动注入的过程。
阅读此文
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,但手册大而全,没有重点,不会讲原理,用的时候翻翻还行,深入探究就不管用了。
阅读此文
动态代理说大不大,说小不小,可深可浅。往深了说还是对JVM的了解程度要足够深入,时间篇幅有限,本文专注于回答如下问题,不作更深入的探讨。
- JDK和Cglib动态代理,分别怎么使用
- JDK动态代理的原理
- Cglib动态代理的原理
- 为什么JDK动态代理一定要实现接口,而Cglib就不用?
- JDK和Cglib,本质上有什么区别?
阅读此文
我会写Java反射,我知道反射是用来获取、改变程序运行时状态的方式,通过反射API我们能够获取类对象、类的方法、成员变量、注解等。
我不会写Java反射,我不知道Type和Class有啥关系,ParameteredType、TypeVariable呢?
我会Java反射吗?不,我不会。
阅读此文
序列化探索之Protobuf
Protobuf是谷歌提出的一种高压缩比的序列化格式,二进制,不可读,语言无关,平台无关。拥有自己的语法规则,压缩编码算法,并提供主流语言的API生成器(即Protobuf编译器),其序列化结果很小,能够有效节省带宽。
掌握Protobuf,需要比较了解三个方面,其中,如果只是单纯滴使用,前两个方面即可。
- proto语法规则,即proto文件的语法规则
- 具体语言的API生成及使用规则,即通过proto文件生成对应语言的代码
- 序列化和反序列化算法
阅读此文
Gson是一个相对简单的库,没有那么多功能,从设计上也并不想让别人去扩展它,它只想安安静静地做一个Json序列化库,简单而实用。
阅读此文
开局一吐槽,Fastjson的文档,比Jackson还差。Jackson只是位置不明确,如果安下心来看看,还是能够理清楚的。而Fastjson是位置不明确,如果安下心来看看,还会发现,它的文档零零散散,中英文混杂,找不准主线在哪儿。我记得知乎上有个问题,fastjson这么快老外为啥还是热衷 jackson?,就这文档,让老外用个啥。
不过看还是要看的,毕竟它是目前主流序列化框架之一。老样子,我们还是从基本使用方法和原理分析两部分着手。
阅读此文
写这篇文章时,我一度陷入了纠结与不安,再次体会到了聚焦的重要性。Jackson看似简单,实则功能强大,这两天有些迷失,不知道要看些什么,要写些什么。但路得一步一步走,饭得一口一口吃,纵使它可供探索的点繁如星辰,我也得将焦点拉回,否则就叫失控。至于其它的点,以后再说。因此,本文将聚焦如下几点
- Jackson的能力
- 基本原理
- module工作原理
阅读此文
文章不长,但代码演示居多,可选择性阅读
Kotlin以扩展包的形式提供了序列化能力,使得能够以“Kotlin方式”进行序列化。Kotlin设计目标,是提供一个序列化抽象,具体格式实现可用Json、CBOR、Protobuf、Properties、Yaml等进行替换。但就目前的进度,仅提供了对Json的稳定支持。其它格式都处于试验阶段。
因此,我们看Kotlin的序列化,主要看的就是数据对象与Json之间的序列化和反序列化。
阅读此文
序列化和反序列化,渗透在日常开发的方方面面。
所谓的序列化,就是将数据转换为能够在网络上传输、在数据库中存储、在文件中持久化的格式,这类格式很多,可以是字节流(如Java自带的序列化机制)、可以是JSON(系统之间传输用的较多)、可以是Protocol Buffers(压缩率高,GRPC有用)。反序列化,即序列化的反过程。
序列化这件事,不同的语言、库,提供了不同的使用方法,哪怕是对同一种序列化格式的支持也有差别。因此,深入了解常用的序列化技术,很有必要。不要再去记使用方法了,我们来看原理吧。
阅读此文
UUID,Universal Unique Identifier,全局唯一标识符。也叫做GUID,Global Unique Identifier。
概念都了解,全局唯一嘛,但怎么实现的?多大概率重复?JDK的UUID和PostgreSQL的UUID一样吗?带着这些问题,我们从RFC,到JDK源码、PG手册,一点点看。
本文包含以下内容:
阅读此文
震惊,查询SQL的创建居然是根据Repository的方法名来生成的。
对于JPA,我们只需要掌握几点。
阅读此文