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)

相关推荐
小酒窝.12 分钟前
【多线程】多线程打印1~100
java·多线程
君爱学习16 分钟前
基于SpringBoot的选课调查系统
java
APIshop27 分钟前
Java 实战:调用 item_search_tmall 按关键词搜索天猫商品
java·开发语言·数据库
血小板要健康38 分钟前
Java基础常见面试题复习合集1
java·开发语言·经验分享·笔记·面试·学习方法
淼淼7631 小时前
安装jdk1.8
java·开发语言
毕设源码-朱学姐1 小时前
【开题答辩全过程】以 高校食堂餐饮管理系统的设计与实现为例,包含答辩的问题和答案
java
知识即是力量ol1 小时前
基于 Redis 实现白名单,黑名单机制详解及应用场景
数据库·redis·缓存
过期动态1 小时前
Java开发中的@EnableWebMvc注解和WebMvcConfigurer接口
java·开发语言·spring boot·spring·tomcat·maven·idea
摇滚侠1 小时前
IDEA 定义返回值快捷键
java·ide·intellij-idea
毕设源码-郭学长1 小时前
【开题答辩全过程】以 高校考勤管理系统为例,包含答辩的问题和答案
java·eclipse