java:aocache的单实例缓存(一)

上一篇博客《java:aocache:基于aspectJ实现的方法缓存工具》介绍了aocache的基本使用,

介绍@AoCacheable注解时说过,@AoCacheable可以定义在构造方法上,定义在构造方法,该构建方法就成了单实例模式。

也就是说,只要构建方法参数相同,new 返回的实例都是同一个,示例如下:

java 复制代码
	@Test
	public void test7Constructor() {
		try {
			Date d = new Date();
			TestUser user = new TestUser("jerry",0,d);
			log("user:{}",user);
			for(int i=0;i<5;++i) {
				TestUser o = new TestUser("jerry",0,d);
				log("u{}:{}",i,o);
                /** 每次 new 返回的都是同一个实例 */
				assertTrue(o == user);
			}
		} catch (Throwable e) {
			e.printStackTrace();
			fail(e.getMessage());
		}
	}
	private static class TestUser {
		String name;
		Integer age;
		Date birthdate;
		@AoCacheable
		TestUser() {
			this(null, null, null);
		}
		@AoCacheable
		protected TestUser(String name, Integer age, Date birthdate) {
			this.name = name;
			this.age = age;
			this.birthdate = birthdate;
		}
	}

注意

  • @AoCacheable定义在私有(private)构造方法上无效,因为基于AspectJ的工作原理,它不能拦截私有构造方法。
  • 对于是否将@AoCacheable定义在构造方法上要认真考虑是否适合你的使用场景,因为一旦定义了将@AoCacheable注解定义在构造方法上,该方法new操作就不能创建新实例。

所以@AoCacheable定义在构造方法的使用方式是有限制的。因为就无法再创建新实例,如果又希望保持构造方法创建新实例,又能得到单实例缓存。建议不要在构造方法上定义@AcCacheable注解注解,而是定义一个有@AcCacheable注解的静态方法用于获取单实例,示例如下:

java 复制代码
	protected TestUser(String name, Integer age, Date birthdate) {
		this.name = name;
		this.age = age;
		this.birthdate = birthdate;
	}
	@AcCacheable
	public static TestUser getSingleton(String name, Integer age, Date birthdate){
		new TestUser(name,age,birthdate);
	}

项目仓库

访问码云仓库获取完整代码及说明:
aocache: aocache(Aspect Oriented Cache)是一个基于aspectJ实现的方法缓存工具。 (gitee.com)

相关推荐
天荒地老笑话么24 分钟前
Spring MVC数据绑定和响应——数据回写(二)JSON数据的回写
java·spring·java-ee·json·mvc
天荒地老笑话么25 分钟前
Spring MVC的高级功能——异常处理(一)简单异常处理器
java·spring·java-ee·mvc
战神刘玉栋35 分钟前
《后端程序猿 · 基于 Lettuce 实现缓存容错策略》
java·spring·缓存
系统之家装机大师36 分钟前
Kimi 上下文缓存功能开启公测!降低使用费用,加快模型相应速度
缓存·ai
hycccccch39 分钟前
Java&MySQL 学习(基础)
java·开发语言·笔记·学习·mysql
MavenTalk1 小时前
AI大模型对话(上下文)缓存能力
缓存·月之暗面
Filwaod1 小时前
八、【源码】Aware感知对象
java·spring·源码
Lsx-codeShare1 小时前
Nginx Http缓存的必要性!启发式缓存有什么弊端?
前端·javascript·nginx·http·缓存·webpack
UPToZ1 小时前
【折腾笔记】兰空图床使用Redis做缓存
redis·笔记·缓存
LiZhen7981 小时前
list.toArray(new String[0])详解
java·list