一个基于aspectJ实现的方法缓存工具
设计用于对方法计算返回的结果缓存,以实现同的输入参数只计算一次,第二次以后调用法则返回第一次计算的结果,以减少重复计算提高系统运行效率,适用于运行时(runtime)输入参数与输出结果保持恒定映射的场景。 比如实现整数加法的方法:int add(int l,int r){return l+r;},对于每次调用输入的l,r参数如果不变,那么返回结果也恒定不变,我们就可以将第一次计算的结果保存下下,下次对于同样的参数输入,直接从缓存中返回结果,不再计算。 aocache基于切面编程(Aspect-Oriented Programming)框架自动实现了上述方法计算结果缓存逻辑。让计算结果方法缓存变得很方便,帮助应用开发提高代码质量和开发效率。 基本的逻辑就是下面这样的: - 返回值 方法(参数1,参数2。。。){
- if(缓存中有(参数1,参数2。。。)对应的结果){
- 返回缓存数据;
- }
- 执行计算,将结果保存到缓存;
- 返回结果;
- }
复制代码 特点- 依赖库少,CTW和PCW模式下没有额外依赖(LTW模式下需要依赖org.aspectj:aspectjweaver)
- JDK 1.7实现,对JDK版本要求低,适用场景范围广
- 支持递归方法
- 基于注解实现,支持方法和构造方法缓存(构造方法缓存时即实现单实例模式)
- 可以灵活配置缓存,支持弱引用模式,软引用模式
- 支持单实例缓存
快速入门推荐以编译时织入(CTW--Complie Time Weaving)模式(也称静态编入)使用aocache,这种方式项目依赖最少,对配置的修改也最少。 步骤如下。 pom.xml配置引入依赖 - <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjrt -->
- <dependency>
- <groupId>org.aspectj</groupId>
- <artifactId>aspectjrt</artifactId>
- <version>1.8.9</version>
- <scope>provided</scope>
- </dependency>
- <!-- https://mvnrepository.com/artifact/com.gitee.l0km/aocache -->
- <dependency>
- <groupId>com.gitee.l0km</groupId>
- <artifactId>aocache</artifactId>
- <version>0.5.0</version>
- </dependency>
复制代码 单实例缓存前面介绍@AoCacheable注解时说过,@AoCacheable可以定义在构造方法上,定义在构造方法,该构建方法就成了单实例模式。 也就是说,只要构建方法参数相同,new 返回的实例都是同一个,示例如下: - @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操作就不能创建新实例。

链接:https://pan.quark.cn/s/842f65965cd6
提取码下载:
|