2 卓立0

尚未进行身份认证

我要认证

现在一家电商做广告平台,Java后端后端开发

等级
TA的排名 3w+

Spring源码解读『AOP』

之前的文章我们介绍了Spring IOC的相关概念及相应的底层源码实现,本篇文章我们来看一下Spring的另一重要特性AOP的相关细节。1. AOP示例1.1 Bean interfacepackage com.zhuoli.service.spring.explore.aop.bean;public interface AopBean { void method1(); void method2();}1.2 Bean interface实现packag

2020-07-10 07:45:55

Spring源码解读『通过配置类启动spring容器』

之前的介绍中,Spring容器都是通过xml配置文件启动的,在实际开发中,xml配置的使用是逐渐减少的,一般在开发中更建议使用Java Config。本篇文章我们就来看一下Spring容器如何通过配置类启动的。Spring提供了AnnotationConfigApplicationContext类,实现通过Java Config配置类来启动Spring容器。1. 示例1.1 定义Beanpublic class TestBeanA { private String testName

2020-07-10 07:45:11

Spring源码解读『占位符@Value(“${…}”)替换』

上篇文章介绍了xml配置文件中占位符${…}的解析过程,本片文章我们来继续介绍Spring中另一种占位符@Value(“${…}”),这种占位符一般出现在Java Config中,如下:@Configurationpublic class MyConfiguration { @Value("${jdbc.url}") private String url; @Value("${jdbc.username}") private String userName;

2020-07-10 07:44:22

Spring源码解读『占位符${…}替换』

在使用Spring时,对于一些比较固定的参数,我们一般会采用配置的方式,将这些参数配置在.properties配置文件中,然后在Bean初始化过程中替换为配置文件中配置的真实值。在Spring中,这种典型的的使用会存在以下两种方式:在xml配置中,通过${…}:<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:

2020-07-10 07:43:37

Spring源码解读『@Configuration配置类』

上篇文章我们介绍了通过xml配置文件来解析Bean配置的过程,本篇文章我们来看另一种解析Bean配置的方式,@Configuration配置类。在Spring应用中,为了使用@Configuration配置类,如果使用xml启动ApplicationContext,我们一般会在xml配置文件中加上如下一行配置:<context:component-scan base-package="com.zhuoli.service.spring.explore.config"/>以告诉Sprin

2020-07-10 07:42:04

Spring源码解读『配置文件解析』

之前的文章详细介绍了Bean的实例化和初始化的过程,但其实Bean能实例化、初始化的前提是Spring容器在启动时,间配置文件(配置类)中的配置加载成BeanDefinition,这一点我们再之前的文章Spring源码解读『IOC容器1-自定义实现IOC容器』一文中看得比较清楚。关于Spring对配置文件(配置类)的处理,我们还没有介绍,本篇文章我们就来介绍一下Spring容器启动时是如何加载xml配置文件并加载成BeanDefinition的,在下篇文章来介绍@Configuration配置类。首先来看一

2020-07-10 07:40:06

Spring源码解读『Spring Bean循环依赖』

由于Spring的IOC特性,Bean都是由Spring容器生成的,那么如果Bean是单例的,存在两个Bean,分别为beanA、beanB,beanA依赖beanB,同时beanB也依赖beanA,那么可以想象假如容器不做特殊处理的话,就会发生循环依赖,产生死锁,Bean构造就进行不下去了。但是我们在使用时,其实并没有关注循环依赖的问题,Spring是可以解决这种循环依赖的情况的,本篇文章我们来看一下Spring是如何解决循环依赖的。1. Spring循环依赖示例首先定义两个Bean,BeanA和

2020-06-30 08:37:07

Spring源码解读『Bean扩展接口』

上篇文章我们介绍了Spring Bean的初始化流程,在最后我们提到在通过populateBean方法调用后,调用了initializeBean方法,实现了一些列例如BeanNameAware、BeanPostProcessor等扩展接口的调用,本篇文章我们就来看一下Spring提供给开发者的一些扩展接口。Spring框架运用了非常多的设计模式,从整体上看,它的设计严格遵循了OCP——开闭原则:对修改关闭,外部无法修改Spring整个运作的流程 对扩展开放,可以通过继承、实现Spring提供的众多

2020-06-30 08:36:29

Spring源码解读『IOC容器3-Bean初始化』

上篇文章我们介绍了Spring源码阅读的入口,分析了通过xml配置文件到Spring Bean初始化出来的流程。在上篇文章中,我们讲到,所有非懒加载的bean都是在finishBeanFactoryInitialization方法中完成实例化和初始化。由于该方法是整个Bean加载流程的核心方法,并且介绍起来篇幅较长,所以该方法单独在本篇文章介绍。在阅读源码之前,我们可以简单想象一下该方法的实现内容。在该方法执行之前,所有的Bean配置(通过xml配置文件或者配置类)都已经转变层BeanDefinition并

2020-06-30 08:35:47

Spring源码解读『IOC容器2-Bean加载过程』

上篇文章,我们自定义实现了一个简单地IOC容器。本篇文章我们来介绍一下Spring IOC容器的实现。1. 准备工作为了学习Spring的源码实现,我们需要准备Spring的源码环境,这时我们一般可以有以下两种选择:1.1 下载spring-framework git项目将spring-framework git项目下载到本地git clone https://github.com/spring-projects/spring-framework.git将源码导入到Idea中这

2020-06-30 08:34:59

Spring源码解读『IOC容器1-自定义实现IOC容器』

上篇文章介绍了Spring的相关基础概念,我们了解到Spring Framework提供的两个基础功能就是IOC和AOP。关于IOC容器我们分为两篇文章来介绍,本篇文章会介绍IOC容器的基础概念,并自定义实现一个基础的IOC容器,帮助我们后续更好的解读IOC源码。AOP会在之后的文章中介绍。1. IOC容器基本概念IOC(Inversion Of Control)也叫控制反转,这个概念经常会伴随另一个概念DI(Dependence Injection)依赖注入出现。直白的讲就是,Java中一个对象依

2020-06-30 08:31:52

Spring源码解读『基本概念』

Spring作为一个优秀的开源框架,作为一名服务端开发人员,在工作中必然是每天都要接触的,相信每个人也都能熟练地使用Spring来完成日常工作。毫不夸张的讲,Spring很大程度上改变了Java开发的方式。但是在工作中,我发现很多数人对Spring的了解都停留在表面,很少去深究Spring这一优秀框架底层的原理。结合我自身的体会而言,在刚开始接触这个框架的时候,仅仅是生硬地去记它的一些使用特性,一旦遇到一些“非常规”问题,就搞不定了。随着使用的深入,疑惑的问题越来越多(比如框架给我们带来什么好处?Sprin

2020-06-30 08:31:08

使用Netty实现RPC

Netty作为一个异步事件驱动的网络应用框架,可以用于快速开发可维护的高性能服务器和客户端。国内著名的RPC框架Dubbo底层使用的是Netty作为网络通信的。本篇文章我们来探索一下RPC框架的本质以及使用Netty来实现一个简单地RPC框架。1. RPC是什么RPC(Remote Procedure Call),翻译成中文就是远程过程调用。远程过程就是相对于本地方法而言的,是运行在某个远程的地方而不是本地。通过RPC可以实现像本地函数调用一样调用远程服务,是一种进程间的通信方式。RPC调用的本质可

2020-06-30 08:30:15

使用Netty实现HTTPS

之前的文章理解Https中,介绍了HTTP到HTTPS的演进过程,我们也可以得到一个结论:HTTPS = HTTP + 加密 + 身份认证 + 报文正确性保障。其实也就是在HTTP层和TCP层之间新增一个步骤,通过证书交换通信秘钥并验证客户端服务端身份的合法性(SSL)。所以为了实现HTTPS,必须支持SSL。为了支持SSL,Java提供了 javax.net.ssl 包,它的SSLContext 和SSLEngine类使得解密和加密相当简单和高效。Netty提供了基于SSLEngine的实现OpenS

2020-06-30 08:29:27

Netty基础组件

之前的文章Netty基础篇:Netty是什么?介绍了传统IO编程存在的问题,及Java NIO编程在解决IO编程的问题中的局限性,由此引出IO编程问题的理想解决方案——Netty。在上篇文章中简单展示了Netty的基本使用,本篇文章通过一个Netty服务端的demo来了解一下Netty的基本组件。1. Netty服务端public class EchoServer { private final int port; public EchoServer(int port) {

2020-06-30 08:27:56

Java编程拾遗『JVM垃圾回收』

垃圾收集(Garbage Collection)通常被称为GC,大部分人都把这项技术当作Java语言的伴生产物。事实上,GC的历史远远比Java久远,1960年诞生于MIT的Lisp语言是第一门真正使用内存动态分配和垃圾收集技术的语言。经过半个世纪的发展,内存动态分配与内存回收技术已经相当成熟,一切看起来都进入“自动化”时代,那么为什么我们还要去了解GC和内存分配呢?原因很简单:当需要排查各种内存溢出、内存泄漏问题时,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就需要对这些“自动化”技术实施必要的监控和调

2020-06-30 08:26:36

Nginx + Lua开发

之前Nginx那篇文章讲过,我希望通过Nginx做一个测试环境,目标其实很简单,其实就是使用Nginx做反响代理服务器,绕过现在的鉴权系统,将前端请求转发到相应人员的“开发机”上去,其实在过程中遇到几个比较棘手的问题,如下:如何确定相应的前端请求到后端服务映射,即区别前端请求,将需求A的前端请求转发需求A的机器上而不会转到需求B的开发机上 后端服务会对请求体进行SHA-1数据加密校验,将请求...

2019-04-01 19:22:51

Java编程拾遗『JVM内存区域』

作为一名Java开发人员,JVM是我们每天都会打交道的对象。但是由于JVM处于知识体系的底层,同时工作中有可能接触的机会不是很多,导致很多人都对JVM相关的知识一知半解。一般只会在面试的时候,才来准备这部分内容。但JVM是为了让我们更好的理解Java,更深入了解我们每天开发程序的执行机制。所以从本篇文章开始,我们来介绍以下JVM相关的知识。大致规划一下应该会包括 以下内容:JVM内存区域、垃圾...

2020-01-07 07:43:15

Java编程拾遗『Java ClassLoaser工作机制』

ClassLoader顾名思义就是类加载器,负责将类的.class文件中的二进制数据加载到JVM中,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构(类的方法代码,变量名,方法名,访问权限,返回值等)。类的加载的最终产品是位于堆区中的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。类加...

2020-01-07 07:41:48

Java编程拾遗『ThreadLocal』

本篇文章,我们来介绍一下,Java多线程编程中一个比较常用的工具,线程本地变量——ThreadLocal。ThreadLocal简单的来讲,就是每个线程都有同一个成员变量的独有拷贝。由于每个线程都有成员变量独立的拷贝,所以不存在多线程访问同一成员变量的问题,也就解决了线程安全问题。之前我们介绍的锁,是解决线程安全问题的一个途径,那么本篇文章介绍的线程本地变量是另一种解决线程安全问题的思想,就是通过...

2020-01-07 07:39:31

查看更多

勋章 我的勋章
  • GitHub
    GitHub
    绑定GitHub第三方账户获取
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 勤写标兵Lv4
    勤写标兵Lv4
    授予每个自然周发布9篇以上(包括9篇)原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。