之前一篇博客《java:aocache的单实例缓存》介绍了aoocache使用注解@AoCacheable
实现单实例缓存的方式,同时也指出了这种方式的使用限制,就是这个注解定义的构造方法,不能再创建出新实例。
为了更灵活方便的实现单实例。aocache最新版本0.4.0增加了支持单实例缓存的工具类Singleton
为应用层实现单实例缓存提供了更灵活的方式:
Singleton
提供了weakSingletonOf
,singletonOf
两种方法分别提供弱引用单实例缓存,和普通强引用单实例
weakSingletonOf
java
/**
* 返回全局单实例[弱引用缓存]<br>
* 弱引用存储的实例在没有被引用时会被JVM自动回收,下次调用自动创建新实例
* @param <T> 实例类型变量
* @param clazz 实例类型
* @param parameterTypes 构造方法参数类型数组
* @param args 构造方法参数对象数组
*/
@AoWeakCacheable
public static <T> T weakSingletonOf(Class<T>clazz,Class<?>[] parameterTypes,Object[]args){
/** [反射]创建新实例 */
return newInstance(clazz,parameterTypes,args);
}
singletonOf
java
/**
* 返回全局单实例[缓存]<br>
* 运行时对给定输入参数返回同一实例
* @param <T> 实例类型变量
* @param clazz 实例类型
* @param parameterTypes 构造方法参数类型数组
* @param args 构造方法参数对象数组
*/
@AoCacheable
public static <T> T singletonOf(Class<T>clazz,Class<?>[] parameterTypes,Object[]args){
/** [反射]创建新实例 */
return newInstance(clazz,parameterTypes,args);
}
简单说,weakSingletonOf
和singletonOf
的不同就是:
weakSingletonOf返回的实例有可能不是同一个,因为如果JVM回收了实例,下次调用返回的就是一个新创建的实例。
而singletonOf是普通强引用模式保存实例,所以保证运行时对给定输入参数返回的都是同一实例
所以需要严格单实例的场景就使用singletonOf
,
只是出于减少实例创建次数的需要就使用weakSingletonOf
项目仓库
访问码云仓库获取完整代码及说明:
aocache: aocache(Aspect Oriented Cache)是一个基于aspectJ实现的方法缓存工具。 (gitee.com)