RabbitMQ扩展之交换器间的绑定
RabbitMQ扩展之交换器间的绑定概要AMQP-0-9-1中提供了queue.bind方法用于绑定一个队列到一个交换器,然后发送消息的时候,数据流总是先通过交换器(source)最终到达目标队列中(destination)。RabbitMQ实现了扩展,为交换器提供了一个exchange.bind方法用于绑定一个交换器到另一个交换器。交换器之间的绑定和队列与交换器的绑定在语义上是相同的:单向的、使用路由键和多种交换器类型。这一点允许使用者创建更丰富的路由拓扑。exchange.bind方法中的source和destination反映了消息的流向:从源(source)交换器到目标(destina ...
阅读更多
基于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类型的返 ...
阅读更多