造轮子1 注解管理
造轮子1 注解管理使用public @interface xxx{}可以自定义一个注解,在注解上面定义的注解叫做元注解 以下代码取自开源API文档生成项目Swagger: 在注解中也可以使用注解,我们称这些注解为元注解,上面代码中使用了一些比较常见的元注解 @Target({ElementType.TYPE})用于定义注解的使用范围,常见的包含 TYPE:类、接口、枚举 FIELD:字段声明 METHOD:方法声明 PARAMTER:参数声明 CONSTRUACTOR:构造函数声明 LOCAL_VARIABLE:局部变量声明 ANNOTATION_TYPE:其他注解声明 PACKAGE:包声明(代码中的第一行 声明package的时候)
![造轮子1 注解管理]()
2019-05-25鱼鱼
数据库的存储过程、触发器和一些语法
数据库的存储过程、触发器和一些语法本篇文章讲述基于MySQL的存储过程触发器和一些相关的语法 在数据库中,存储过程是指将复用度很高并且不需要通过程序进行预编译的的SQL语句预先写好存放起来(此处所指的为用户定义在数据库中的存储过程),在需要时直接通过call调用 先看一个例子(注意,这不是创建存储过程的语句): 其中使用了日期相关的函数,DATE_SUB(CURDATE(),INTERCAL 10 DAY)代表当前时间前推十天 这个存储过程作用是查出十天前的数据然后将其删除 MySQL默认的分隔符是" ; ",这样一来定义存储过程就会因为 ; 被打断,所以在定义存储过程前后需要修改分隔符,使用DELIMITER关键字跟随分隔符,实际创建存储过程语句为:
![数据库的存储过程、触发器和一些语法]()
2019-06-12鱼鱼
Redis原理-源码解析:数据结构2 list
Redis原理-源码解析:数据结构2 list所有原理实现基于Redis版本6.0.9 Redis中的list采用的是链表,在开始前,我们先看看list的最基本指令实现 t-list.c 由此可知,Redis的List底层数据结构都是基于quickList的 这是list所依赖的数据结构: quicklist.h 我们注意到其是由quicklistNode所构成的链表,而其中的数据实则为zl(ziplist)或是bookmark,在大多时候quicklistNode都使用ziplist存储数据 在上文中lpush执行了一个插入方法quicklistPush,在quicklist.c中有他的实现: quicklist真正存储数据的结构是ziplist,所以倒不如说,在Redis中,list是一个由ziplist节点构成的链表

2020-11-28鱼鱼
多线程应用提高(III) 并发编程的艺术
多线程应用提高(III) 并发编程的艺术《并发编程的艺术》p36:JMM不保证64位的long型和double型变量的写操作具有原子性 面试中可能经常会被问到HashMap和HashTable的区别,其中最重要的就是前者并不是线程安全的,但其实在高并发的情形下,后者的效率低的不像话甚至不可用,所以在jdk7之后出现了线程高效且安全的ConcurrentHashMap 当并发严重时,某线程若是调用了同步方法,另外的线程将进入阻塞/轮询状态,既不能put也不能get,但ConcurrentHashMap是不同的,它采用了锁的分段技术,将数据分段存储,不同的数据持有不同的锁,这样可用性会大大高于HashTable,所以在实际开发中我们都用ConcurrentHashMap取代HashTable
![多线程应用提高(III) 并发编程的艺术]()
2019-06-18鱼鱼
Spring源码解析(3) IoC容器配置读取和容器refresh
Spring源码解析(3) IoC容器配置读取和容器refresh在文章Spring源码解析(I) 基于SSM看Spring的使用和Spring启动监听中,讲述了web容器启动后会触发的方法实现中生成Context的部分,回顾下核心方法: 我们已经分析到了0.处,他对我们生成的容器做了一个判断,对于web.xml监听初始化的Context,其生成的WebApplicationContext都是ConfigurableWebApplicationContext的子类,所以必然会进入if分支 首先通过loadParentContext先加载了父容器,默认是null 然后调用了configureAndRefreshWebApplicationContext方法进行初始化和配置项的读取

2020-08-09鱼鱼
安全框架的使用:Shiro
安全框架的使用:ShiroShiro与Sping Security均是java的安全框架,主要用于处理用户身份验证和授权 常见场景为用户系统登录 Shiro易用性强,提供了认证,授权,加密,和会话管理功能 Shiro的三大核心组件 : Subject:即当前用户概念,不止代表着某用户,也可以是进程或任何可能的事物 SecurityManager:即所有Subject的管理者,可以把他看做是一个Shiro框架的全局管理组件,用于调度各种Shiro框架的服务 作用类似于SpringMVC中的DispatcherServlet,用于拦截所有请求并进行处理 Realm:Realm是用户的信息认证器和用户的权限认证器,我们需要自己来实现Realm来自定义的管理我们自己系统内部的权限规则

2019-09-29鱼鱼
Java中的动态代理与静态代理
Java中的动态代理与静态代理proxy(代理)作为一种设计模式在Java中已经应用非常广泛,例如常见的拦截器是代理模式设计的,AOP是通过动态代理实现的,而基于AOP的应用就更多了,从简单的事务应用到Dubbo框架,Java开发中离不开代理,本篇文章主要阐述Java中的代理,此处是比较狭义的代理,仅指方法和类中的代理 代理模式是一种非常常见的设计模式,它通过给某对象提供代理,从而通过代理对象控制原对象的引用 以下是代理模式的简单实现: 类Admin: 对应的代理类AdminProxy: 设计良好的聚合代理模式应该是代理类与被代理类共同继承一个接口,此处只为实现功能 这样在执行new AdminProxy().changeWorld()时,除了会调用原本的new Admin().changeWorld(),在方法前后也可以做出些其他的操作
![Java中的动态代理与静态代理]()
2019-08-09鱼鱼
Consul高级应用:多数据中心,模板与Client(Zuul)
Consul高级应用:多数据中心,模板与Client(Zuul)此文整理了Consul比较实用的高级功能:多数据中心,模板与维护模式 Consul提供了多数据中心联动的特性,目前看来多数据中心只是在查询阶段提现,各个数据中心的数据持久化和数据目录(k-v对)的更新不相干扰 也就是说,多数据中心的特性目前看来不能作为可用性的保障,当然 不排除可以手动热切换数据中心 最好判断是否使用多数据中心的情形是判断服务是否属于同一系统下,是否相同serviceId能提供相同的无状态服务,以下列举一些情景: 一个系统拥有多个域名的多套部署,提供版本一致的服务(建议使用多数据中心) 一个系统由多个服务器提供的不同服务提供(视服务具体情况,不建议使用多数据中心)

2020-01-28鱼鱼
Java的socket通信
Java的socket通信网络编程中,会使用socket通信 TCP/IP协议,即Transmission Control Protocol/Internet Protocol,传输控制协议/网际协议,他使用TCP/IP四层模型(实际开发中只涉及到四层模型,软件范畴涉及不到OSI七层参考模型): TCP是面向连接的通信协议,通过三次握手建立连接,通讯完成时要拆除连接,由于TCP是面向连接的所以只能用于端到端的通讯 具有高度的可靠性 三次握手,即通信时,客户端和服务端共计要传输三次包,三次握手建立连接: 1.主机(客户端)发送 SYN=1(建立连接标识)和seq=x(序号),客户端进入SYN_SEND状态,等待服务端确认

2019-03-27鱼鱼
算法:递归
算法:递归递归算法主要寻找: 终止条件:递归的尽头 单级递归的行为:在一次递归里要做的事情 返回值:每次迭代要return的东西 例如 首先,假定方法是已经实现的 终止条件为:当当前节点(传了空节点)或下一节点(传了单节点)为空,则无需反转返回当前节点 递归行为:假定之后的节点均已实现反转,则需要将已经反转的尾部的next变为当前节点,而当前节点由于是第一个节点,其next为null 此处注意在反转前需要先留存反转后的尾部; 返回值:返回反转后的头结点
![算法:递归]()
2020-06-24鱼鱼
ooo
ooo拆箱:包装类-》基本数据类型 Integer Byte -127- 127是以缓存数组指向相同对象,之外的默认new 模块化 完全解耦 #预编译 $直接用 $内容手动干涉 Mybatis有三种基本的Executor执行器,SimpleExecutor、ReuseExecutor、BatchExecutor SimpleExecutor:每执行一次update或select,就开启一个Statement对象,用完立刻关闭Statement对象 ReuseExecutor:执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map
内,供下一次使用
2019-04-02鱼鱼
JVM的垃圾回收
JVM的垃圾回收此文介绍Java的基本垃圾回收机制 GC主要回收的是堆区,在堆中是有对象分代的,一个对象每“逃”过一次回收,对象代数便+1,新生对象被称作新生代(如果是占据内存较大的对象直接定义为老年代),当代数一定时对象将由新生代变为老年代 同时在Java1.7之前还有永久代,保存了一些静态变量 总之,内存回收只发生在新生代和老年代之间 除了分代,内存也有分区: 如图,是内存区域分配,其中Eden存储了新建的小对象,当回收时,将Eden中存活的对象转移到To Survivor区中,将From Survivor中的代数高(一般是15)的存活对象转移到老年代中,代数没达到阈值的存活对象转移到To Survivor中
2021-04-07鱼鱼