基于SpringBoot的Environment源码理解实现分散配置
基于SpringBoot的Environment源码理解实现分散配置前提org.springframework.core.env.Environment是当前应用运行环境的公开接口,主要包括应用程序运行环境的两个关键方面:配置文件(profiles)和属性。Environment继承自接口PropertyResolver,而PropertyResolver提供了属性访问的相关方法。这篇文章从源码的角度分析Environment的存储容器和加载流程,然后基于源码的理解给出一个生产级别的扩展。 本文较长,请用一个舒服的姿势阅读。 Environment类体系 PropertyResolver:提 ...
阅读更多
CGLIB动态代理原理分析
CGLIB动态代理原理分析前提前一篇文章介绍了CGLIB中常用的API,实际上使用了Enhancer和MethodInterceptor之后会生成代理子类,这篇文章就是分析一下CGLIB动态代理的原理。 CGLIB动态代理原理分析我们经常说CGLIB的动态代理的底层通过被代理类生成代理子类实现的,那么下面我们就分析一下生成的子类到底是什么样的。开启CGLIB的debug模式,输出它生成的类到指定的目录: public class DebuggingCglibDemo { private static final String METHOD_NAME = "sayHello"; pub ...
阅读更多
简述CGLIB常用API
简述CGLIB常用APICGLIB简介CGLIB,即Code Generation Library,是一个强大的、高性能的代码生成库。其被广泛应用于AOP框架(例如Spring)中,用以提供方法拦截操作。Hibernate作为一个比较受欢迎的ORM框架,同样使用CGLIB来代理单端(多对一和一对一)关联(延迟提取集合使用的另一种机制)。CGLIB作为一个开源项目,其代码托管在github,地址为:https://github.com/cglib/cglib。 CGLIB的github简介:CGLIB - 字节码生成库,是用于生成和转换Java字节码的高级API。它被AOP、测试、数据访问框架用 ...
阅读更多
Zookeeper客户端Curator使用详解
Zookeeper客户端Curator使用详解前提因为最近项目需要使用Zookeeper这个中间件,提前了解一下它的客户端Curator的使用。 简介Curator是Netflix公司开源的一套zookeeper客户端框架,解决了很多Zookeeper客户端非常底层的细节开发工作,包括连接重连、反复注册Watcher和NodeExistsException异常等等。Patrixck Hunt(Zookeeper)以一句“Guava is to Java that Curator to Zookeeper”给Curator予高度评价。 引子和趣闻:Zookeeper名字的由来是比较有趣的,下面的 ...
阅读更多
深入分析Java反射(八)-优化反射调用性能
深入分析Java反射(八)-优化反射调用性能Java反射的API在JavaSE1.7的时候已经基本完善,但是本文编写的时候使用的是Oracle JDK11,因为JDK11对于sun包下的源码也上传了,可以直接通过IDE查看对应的源码和进行Debug。 前一篇文章已经介绍了反射调用的底层原理,其实在实际中对大多数Java使用者来说更关系的是如何提升反射调用的性能,本文主要提供几个可行的方案。另外,由于方法调用时频率最高的反射操作,会着重介绍方法的反射调用优化。 方法一:选择合适的API选择合适的API主要是在获取反射相关元数据的时候尽量避免使用遍历的方法,例如: 获取Field实例:尽量避免频 ...
阅读更多
深入分析Java反射(七)-简述反射调用的底层实现
深入分析Java反射(七)-简述反射调用的底层实现前提Java反射的API在JavaSE1.7的时候已经基本完善,但是本文编写的时候使用的是Oracle JDK11,因为JDK11对于sun包下的源码也上传了,可以直接通过IDE查看对应的源码和进行Debug。 本文主要介绍反射调用的底层实现,当然还没有能力分析JVM的实现,这里只分析到最终Native方法的调用点。底层会依赖到Unsafe类,可以的话可以看下笔者之前写的一篇文章《神奇的魔法类和双刃剑-Unsafe》。 反射调用的底层实现探究主要考虑下面的情况: 属性操作:java.lang.reflect.Field#set(Object ...
阅读更多
深入分析Java反射(六)-反射调用异常处理
深入分析Java反射(六)-反射调用异常处理前提Java反射的API在JavaSE1.7的时候已经基本完善,但是本文编写的时候使用的是Oracle JDK11,因为JDK11对于sun包下的源码也上传了,可以直接通过IDE查看对应的源码和进行Debug。 本文主要介绍一个使用反射一定会遇到的问题-反射调用异常处理。 反射调用异常处理反射调用出现异常的方法主要考虑下面的情况: 属性操作:java.lang.reflect.Field#set(Object obj, Object value)和java.lang.reflect.Field#get(Object obj)。 构造器调用:java ...
阅读更多
神奇的魔法类和双刃剑-Unsafe
神奇的魔法类和双刃剑-Unsafe前提JDK9或者以后,sun.misc包的源码也可以上传到JDK类库中,可以直接导入IDE进行注释的阅读,这一点是比较好的改进。本文基于JDK11的源码阅读Unsafe类的注释,介绍一下这个类的使用方式。 Unsafe简介在JDK9之后,sun.misc.Unsafe被移动到jdk.unsupported模块中,同时在java.base模块克隆了一个jdk.internal.misc.Unsafe类,代替了JDK8以前的sun.misc.Unsafe的功能,jdk.internal包不开放给开发者调用。 Unsafe是用于在实质上扩展Java语言表达能力、便于 ...
阅读更多
深入分析Java反射(五)-类实例化和类加载
深入分析Java反射(五)-类实例化和类加载前提其实在前面写过的《深入分析Java反射(一)-核心类库和方法》已经介绍过通过类名或者java.lang.Class实例去实例化一个对象,在《浅析Java中的资源加载》中也比较详细地介绍过类加载过程中的双亲委派模型,这篇文章主要是加深一些对类实例化和类加载的认识。 类实例化在反射类库中,用于实例化对象只有两个方法: T java.lang.Class#newInstance():这个方法只需要提供java.lang.Class<T>的实例就可以实例化对象,如果提供的是无限定类型Class<?>则得到的是Object类型的返 ...
阅读更多
深入分析Java反射(四)-动态代理
深入分析Java反射(四)-动态代理动态代理的简介Java动态代理机制的出现,使得Java开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类。代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执行的过程中,开发人员还可以按需调整委托类对象及其功能,这是一套非常灵活有弹性的代理框架。Java动态代理实际上通过反射技术,把代理对象和被代理对象(真实对象)的代理关系建立延迟到程序运行之后,动态创建新的代理类去完成对真实对象的代理操作(可以改变原来真实对象的方法行为),这一点成为了当前主流的AOP框架和延迟加载功能的基础。本文在查看和编写动态代理相关的代码使 ...
阅读更多