SpringBoot通过拦截器实现授权码拦截
文章首发于:clawhub.club
需求:个别接口,需要授权码才可以使用,所以要配置拦截器。
首先要实现WebMvcConfigurer接口,Spring的WebMvcConfigurer接口提供了很多方法让我们来定制SpringMVC的配置。如图:
实现代码:
1234567891011121314@Configurationpublic class WebConfigurer implements WebMvcConfigurer { /** * The Auth code interceptor. */ @Autowired private AuthCodeInterceptor authCodeInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(authCodeInterceptor).addPathPatterns("/ ...
Maven版本号管理及多模块项目统一修改版本号
文章首发于:clawhub.club
Maven版本管理X,Y,Z分别表示主版本号,次版本号,补丁版本号。主版本号为0时,表示是开发阶段的版本号管理。
版本号的递增原则
主版本号,当有非兼容性的变更时,递增主版本号;
次版本号,当以可向后兼容的方式增加了功能时,递增次版本号,以及
补丁版本号,当有向后兼容的bug修复时,递增补丁版本号。
预发布和构建元数据的附加标签可用作主版本、次版本和补丁版的扩展。
snapshot与release
snapshot版本代表不稳定、尚处于开发中的版本,即快照版本。
release版本代表功能趋于稳定、当前更新停止,可以用于发行的版本。release 版本一旦发布,就不可改变。
多模块统一修改版本号在顶级 Module 中添加插件123456789101112<build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <ar ...
JAVA操作commons-compress打zip包
文章首发于:clawhub.club
引入maven依赖:
12345<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-compress</artifactId> <version>1.9</version> </dependency>
打包将path文件夹下所有文件都打包到out文件中。
12345678910111213141516171819202122232425262728293031/** * Do zip pack. * * @param path the path * @param out the out * @throws IOException the io exception */ public static void doZipPack(Path path, ...
JAVA批量删除文件夹及其子文件-统计文件夹下所有文件数量-walkFileTree
文章首发于:clawhub.club
walkFileTreeNIO用来操作文件的API用起来是很舒服的,特别是这个walkFileTree静态方法:
1234public static Path walkFileTree(Path start, Set<FileVisitOption> options, int maxDepth, FileVisitor<? super Path> visitor)
start开始的文件,也就是你要操作的文件夹
options 配置遍历的选项,一般用EnumSet.of(FileVisitOption.FOLLOW_LINKS)遵循符号链接填充。
maxDepth迭代的最大深度
visitor要为每个文件调用的文件访问器,一般使用SimpleFileVisitor,因为可以任意实现自己想要使用的方法,其实现了Fi ...
JAVA使用FTP远程创建多级文件夹
文章首发于:clawhub.club
java使用ftp是没有提供创建多级文件夹的能力的,所以只能自己封装实现:这里引用了commons-net Maven依赖:
1234567<!-- https://mvnrepository.com/artifact/commons-net/commons-net --><dependency> <groupId>commons-net</groupId> <artifactId>commons-net</artifactId> <version>3.6</version></dependency>
创建多级目录FTP远程进入多层目录文件,如果已存在该目录文件,则不创建,如果无,则循环创建多层目录文件,具体源码:
12345678910111213141516171819202122232425262728/** * FTP远程进入多层目录文件,如果已存在该目录文件,则不创建,如果无,则循环创建多层目录文件 ...
LMDB封装的本地持久化队列与BDB持久化队列性能对比
文章首发于:clawhub.club
这几天一直研究怎么将LMDB作为持久化队列,今儿终于出来了一个简单的版本,以前用到的本地持久化队列是BDB封装的,虽然已经很稳定了,但是技术就应该有好的点子就去尝试一下,万一真的很不错呢。
经过简单的测试,效果真的还是可以的:
入队文件:110,592 字节;时间单位为纳秒。//不手动执行 bdbQueue.sync()方法,测试结果bdb offer 耗时:303738lmdb offer 耗时:323650bdb poll 耗时:446820lmdb poll 耗时:42868//手动执行 bdbQueue.sync()方法,测试结果bdb offer 耗时:6290361lmdb offer 耗时:386631bdb poll 耗时:432605lmdb poll 耗时:67527
从结果中可以看出,lmdb的读性能确实很好,写性能与BDB基本持平(当然是不手动执行DBD的sync命令,同步写入磁盘)。
封装的队列源码已经上传至github:https://github.com/ClawHub ...
JAVA使用LMDB当作本地持久化队列
文章首发于:clawhub.club
项目中使用BDB作为本地持久化缓存,效果很稳定,最近事情比较少,所以在研究能不能将LMDB改成本地持久化队列,根据网上收集的一些性能报告,LMDB还是优于BDB的,参考:LMDB简介。
既然是本地持久化队列,首先是本地持久化,LMDB是支持的;其次是队列,先进先出,那就需要指针操作,即key-val中,key为指针位。
开搞~首先解决LMDB底层操作,在这引入lmdbjava的maven依赖:
12345<dependency> <groupId>org.lmdbjava</groupId> <artifactId>lmdbjava</artifactId> <version>0.7.0</version></dependency>
操作LMDB的相关方法:因为是测试,也没有规范相关代码,配置项也没有抽出。
12345678910111213141516171819202122232425262728293031323334353 ...
JAVA-BDB中使用Kyro序列化框架
文章首发于:clawhub.club
JAVA中使用BDB默认是使用JAVA自带的序列化,通过继承Kryo序列化框架,可以提升一些性能。在创建com.sleepycat.collections.StoredSortedMap对象的时候,要指定键值对的序列化方式,在这个地方,切入Kryo序列化框架:
12345678public StoredSortedMap(Database database, EntryBinding<K> keyBinding, EntryBinding<V> valueBinding, boolean writeAllowed) { super(new DataView(database, keyBinding, valueBinding, null, writeAllowed, null)); }
...
Java四种引用类型
文章首发于:clawhub.club
Java四种引用类型强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(Phantom Reference)
强引用Java中默认声明的就是强引用,只要强引用存在,垃圾回收器将永远不会回收被引用的对象。
软引用软引用是用来描述一些非必需但仍有用的对象。在内存足够的时候,软引用对象不会被回收,只有在内存不足时,系统则会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常。java.lang.ref.SoftReference
弱引用无论内存是否足够,只要 JVM 开始进行垃圾回收,那些被弱引用关联的对象都会被回收java.lang.ref.WeakReference
虚引用虚引用是最弱的一种引用关系,如果一个对象仅持有虚引用,那么它就和没有任何引用一样,它随时可能会被回收,虚引用必须要和 ReferenceQueue 引用队列一起使用.java.lang.ref.PhantomReference
引用队列(ReferenceQu ...
带过期时间的Map-ExpiringMap
文章首发于:clawhub.club
有的时候,一些需求过于简单,不必要用很复杂的方式解决,比如不引入中间件。这个ExpiringMap就是其中的一个产物,当然,单机环境下它仍然有自己的用途。ExpiringMap包含一个工作线程,这个线程定期扫描现有的键值对中,是否有过期的数据,如果有的话就删除,并且支持实现过期时监听事件。源码相对来说比较简单,是mina中的一个工具类:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813 ...