WHH

MY BLOG

Spring请求拦截

在使用Spring框架时,可以知道所有Spring入口都是从org.springframework.web.servlet.FrameworkServlet.processRequest中进入,可以通过对该方法进行字节码增强,达到拦截的目的。
使用javassistprocessRequest方法的前后分别插入操作代码。通过javassist提供获取当前对象出入参数等,做一些相关的操作。

阅读全文 »

准备从0搭建一个框架,设计调用链,写下构建过程。

agent基础使用

在JDK6的时候,更新了javaagent,在启动前会执行jar中配置的premain。在启动项目前在代码中对加载的class进行字节码修改,插入特定代码,如日志输入输出,达到项目跟踪的目的。

阅读全文 »

业务逻辑

主要是通过商品查询商品相关的活动信息,流程如下

1、查询商品相关信息(DB)
2、查询商品对应活动相关信息(DB)
3、查询商品在指定门店是否被排除(DB)
4、赠品库存校验(HTTP)
5、限购校验(HTTP+Redis)
6、数据封装返回

业务逻辑流程比较清晰

阅读全文 »

使用fastdfs搭建文件服务器,用于存储图片。通过docker虚拟服务完成分布式系统的搭建。

构建基础镜像

为了方便服务的启动以及后续的配置,需要先创建基本的fastdfs镜像。

阅读全文 »

冒泡排序

冒泡排序简单来说,就是从左到右排序,如果右边较大,交换二者位置,继续遍历直到末尾得到最大值。

冒泡排序图解如下:

阅读全文 »

在编译Java文件生成Class文件最终都需要加载到虚拟机中才能使用。虚拟机把Class文件加载到内存,并对数据进行校验、转换解析、初始化,最终形成可以被虚拟机直接使用的Java类型。

类从被加载到卸载,生命周期如下:
加载 —> 验证 —> 准备 —> 解析 —> 初始化 —> 使用 —> 卸载

其中验证、准备、解析三个节点称为连接。

  • 加载:找到Class加载到内存中,生成一个代表改类的Class对象(不同的虚拟机实现可不一样)。
  • 验证:校验Class中字节流符合当前虚拟机要求,主要包括文件格式验证、元数据验证、字节码验证、符号引用验证(NoSuchFieldError,NoSuchMethodError)。
  • 准备:为类变量分配内存初始化变量的初始值(只是赋值初始值,并不是赋值准确的值,如static a=1,此处static=0,之后初始化在设置static=1)此处不包含final修饰的static,因为final修饰的static在编译时就会分配。
  • 解析:主要将常量池中符号引用(用于描述所引用的目标,目标不一定已经加载到内存中)替换为直接引用的过程。虚拟机要求在执行anewarray、checkcast、getfield、getstatic、instanceof、invokeinterface、invokespecial、invokestatic、invokevirtual、multianewarray、new、putfield、putstatic这13操作符之前对所使用的符号引用进行解析即可。
  • 初始化:类加载最后阶段,如果类具有父类,向上初始化,执行静态代码块已经初始化静态属性。

上述中加载、验证、准备、初始化、卸载是确定的顺序,解析并不一定在上述所在的顺序,在有些情况下,解析可以在初始化之后,这是为了支持Java运行时绑定。

阅读全文 »

在部署项目时,每次需要配置不同的环境,如tomcat,jdk等等,过于麻烦,如果直接使用docker做好镜像后,启动docker容器即可方便启动项目。

docker配置tomcat

下载jdk、tomcat解压放到本地。
编写Dockerfile。

阅读全文 »

因为在家有个笔记本装的ubuntu,需要在公司访问家里笔记本,家中的宽带没有内网IP,所以需要通过反向代理访问家中电脑,需要一台外网服务器作为中转,使用的是阿里云做为中转服务器。

| 机器 | 描述 |
| : –| : –|
| 家ubuntu | 内网 |
| 阿里云 | 独立IP |
| 公司 | 内网 |

1、先通过家里机器反向代理到阿里云
2、阿里云提供正向代理,通过公司访问

阅读全文 »

在阿里云上现在购买esc好像默认是专有网络,以前使用的是经典网络。如果现在有两台服务器分别不在同一个账号上,那么需要配置高速通道。不过还好的是对于同一个地区高速通道并不要钱。

在其中一台服务器上部署测试环境,同时搭建jenkins用来自动化打包和发布。

先安装JDK、Tomcat、Nginx,不会有什么问题。

阅读全文 »

哈希表(Hash Table,也叫散列表),是根据关键码值 (Key-Value) 而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。

在Java中HashMap就是使用的哈希表。

在HashMap中实际存储数据时在一个数组中,在插入时如果放入key,通过(key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16)获取hash,在数据存入table时,通过(n - 1) & hash获取数据应该存入数组下角位置。如果该位置存在数据,在JDK1.8之前是通过一个链表存入,如果重复就会吧数据放入该链表后,在JDK1.8里面是先通过链表存储,如果链表长度超过TREEIFY_THRESHOLD8通过红黑树来存储的数据。在取值时通过比较值来判断获取的key是否是传入当然key。
在转换树时,通过判断MIN_TREEIFY_CAPACITY64,超过才会转换为树,为了避免在哈希表建立初期,多个键值对恰好被放入了同一个链表中而导致不必要的转化。

在插入数据时,如果数据满了,当然不可能每次都放入链表或树中,这样在数据量较多的时候,会严重影响效率。在HashMap中有个扩容因子DEFAULT_LOAD_FACTOR,当插入数据后,数据大于该扩容因子,那么会把数据进行2倍的扩容,在扩容时,如果红黑树的长度小于UNTREEIFY_THRESHOLD6则会退化采用链表,同时把原有的数据重新插入。

阅读全文 »
0%