最近在做一个项目的时候,用到了业务自已的缓存,发现有很多这样的代码:
public List<User> findUsers(String userName){
Object result = getFromCache(createKey(userName));
if(result!=null){
return result;
}
.....
result = userDAO.findData(userName);
putToCache(createKey(userName));
return result;
}
这几行是非常死的东西,除了key之外,到处都是一样,于是想到用SPRING的AOP注解来寻求解决方法,同时看了一些有关注解的文章,发现很难在AOP中取得所需要的KEY,因为生成KEY的方法基本都不一样,目标方法参数的个数和未知的类型也导致难以统一生成KEY。自定义注解也不能直接实现在方法的前后进行拦截,下面是我没有实现的想法:
private String createKey(String userName){
return "user_List_Cache"+userName;
}
//注解的第一个参数是上面的方法,第二参数调用那个方法所需要的参数
//注解现在没有传递方法,也没法传递运行时的值--据我所知
@cache(keyMthod=createKey,keyPara=userName);
public List<User> findUsers(String userName){
//注解帮我在方法的前后进行调用注解类里的方法,我在注解类里写那死代码,
//这样这里就只需要写查询的逻辑,从数据库返回结果就行
......
return userDAO.findData(userName);
}
我的梦想:java注解类可以有方法实现,当上面的findUsers被执行时,注解类的某个方法会在方法执行前被调用,另一个方法会在之后被调用,且能方便的从当前运行环境中取得所需的对象和值。
提两个问题
1、我最上面的那段代码各位有什么更好的实现吗?请赐教
2、JAVA其实要支持这种注解也不难,为什么注解不做更强大一些,还是本来就可以,是我没发现?
补充一点,感谢很多朋友发表自已的意见,但有不少的朋友忽略我不能违背的一些条件:
1、使用SPRING的AOP意见,请考虑在类类内部调用时如何处理。
2、createKey方法的名字和参数不是固定的,每个业务类都可能不一样,而且有可能一个类有多个这样的方法。
欢迎讨论,但不要人身攻击......
###############10年以后更新#############2021-01-15 20:35
没想到,10年以后我真的还在写代码,偶然想起来当年有这样的想法还没有实现,今天这个实现方案,应该早在当年就具备外部条件了,奈何没有发现,今天偶然想起,果然只用了半天实现了,当年可能不具备的条件是,实际运行时可能取不到被拦截方法的真实参数名,在JDK1.8以前,可能只能取到arg0,arg1...这种,但不是必须的,有则更好而已
@LocalCache(keyPaths = {"system","bizType"})
public Object queryConfigs(String system, String bizType) {
// 这里只管查数据库或者调远程读接口,随意。。。
return queryDB()....
}
主要思想这里说下:
1、基于LocalCache注解先实现一个AOP切面;
2、切面执行时,可以取出注解的配置,这里这个配置就是被拦截方法的参数名,然后根据名称,取得拦截方法的运行时参数值,拼装成key,然后去取缓存,
3、如果取到,则返回,不再调用被拦截方法,如果取不到,则调用被拦截方法,并且把结果放入缓存。
分享到:
相关推荐
Nutz 可以做什么? * Dao -- 针对 JDBC 的薄封装,事务模板,无缓存 * Ioc -- JSON 风格的配置文件,声明时切片支持 ...* Aop -- 轻便快速的切面编程支持 * Plugin -- 轻便的插件机制 * Resource -- 资源扫描
如果一个 Web 应用,你在 WEB-INF/lib 下只 需要放置一个 nutz.jar 就够了 当然你要使用连接池,数据库驱动等功能,还需要自行添置 jar 包。 -------------Nutz 为谁而设计? 如果你觉得 Hibernate 控制比较繁琐,...
springboot框架中使用自定义注解,配合切面实现接口限流,增加ip黑名单功能,可实现ip+账号+接口进黑名单,也可以实现账号+ip进黑名单及禁用账号; 可以学会自定义注解使用、自定义响应码枚举及使用、自定义异常类及...
│ 104-在切面中获取自定义注解-1.mp4 │ 105-完善通知类-1.mp4 │ 106-druid监控中心的配置-1.mp4 │ 11-逻辑语句-1.mp4 │ 12-计算属性-1.mp4 │ 13-使用class绑定样式-1.mp4 │ 14-使用style绑定样式-1.mp4 │ 15...
是一个特殊的类,它结合了切入点和通知,每个切入点被定义为一个注解,每个通知是这个切面内部的一个方法。 您可以在不同的来源阅读更多关于 AOP 的信息,有关于 Java 语言的好文章,它们也可以应用于 PHP,因为它是...
切面使用 设计模式使用 事物、回滚使用 docker、nginx使用 图片服务器OSS使用 stram、lambda使用 多线程、线程池使用 定时任务使用 短信验证、邮件服务使用 JWT验证TOKEN令牌使用 雪花算法分布式算法使用 拦截器、...
Spring框架为开发提供了一系列的解决方案,比如利用控制反转的核心特性,并通过依赖注入实现控制反转来实现管理对象生命周期容器化,利用面向切面编程进行声明式的事务管理,整合多种持久化技术管理数据访问,提供...
Spring框架为开发提供了一系列的解决方案,比如利用控制反转的核心特性,并通过依赖注入实现控制反转来实现管理对象生命周期容器化,利用面向切面编程进行声明式的事务管理,整合多种持久化技术管理数据访问,提供...
每个系统实现切面aspect注解添加到控制器上面,每个请求根据当前系统的用户名去纠正Redis里面有没有存入相同的用户名,存入的话说明当前用户在别的系统退出了,那么清除当前访问项目的局部会话cookie。 将JWT方式的...
7.10.2 使用LTW织入一个切面 7.10.3 在Tomcat下的配置 7.10.4 在其他Web应用服务器下的配置 7.11 小结 第3篇 数据访问 第8章 Spring对DAO的支持 8.1 Spring的DAO理念 8.2 统一的异常体系 8.2.1 Spring的DAO异常体系...
7.10.2 使用LTW织入一个切面 7.10.3 在Tomcat下的配置 7.10.4 在其他Web应用服务器下的配置 7.11 小结 第3篇 数据访问 第8章 Spring对DAO的支持 8.1 Spring的DAO理念 8.2 统一的异常体系 8.2.1 Spring的DAO异常体系...
氧 轻量级Java框架 介绍 一个轻量级Java框架 氧核 ...可使用注解Aspect或直接实现Interceptor编写切面 部分工具类 氧气瓶 小巧简单的jdbc实现,纯jdk实现,无第三方jar 支持多数据源 基于sql进行cru
配置AOP切面编程,解决日志记录业务。基于转账案例,演示事务管理操作。基于Cache注解模式,管理Redis缓存。基于Yml配置的方式,实现文件上传逻辑。配置MongoDB数据库,实现增删改查操作。配置Actuator组件,实现系统监控...
mybatis-plus逆向生成 其中融入短信通知(榛子云)、邮件通知(boot-starter-mail)、短信验证(kaptcha)、一二级缓存(JetCache)、跨域登录(jjwt)、数据库连接(druid),还包括自定义注解、切面编程等相关东西...
6.3.1. 声明一个切面 6.3.2. 声明一个切入点 6.3.3. 声明通知 6.3.4. 引入 6.3.5. 切面实例化模型 6.3.6. Advisors 6.3.7. 例子 6.4. AOP声明风格的选择 6.4.1. Spring AOP还是完全用AspectJ? 6.4.2. ...
6.2.2. 声明一个切面 6.2.3. 声明一个切入点(pointcut) 6.2.3.1. 切入点指定者的支持 6.2.3.2. 合并切入点表达式 6.2.3.3. 共享常见的切入点(pointcut)定义 6.2.3.4. 示例 6.2.4. 声明通知 6.2.4.1. 前置通知...
7.6.1 创建一个安全切面 7.6.2 使用元数据保护方法 7.7 小结 第8章 Spring和基于POJO的远程服务 8.1 Spring远程调用概览 8.2 与RMI一起工作 8.2.1 连接RMI服务 8.2.2 输出RMI服务 8.3 使用Hessian和Burlap...
7.6.1 创建一个安全切面 7.6.2 使用元数据保护方法 7.7 小结 第8章 Spring和基于POJO的远程服务 8.1 Spring远程调用概览 8.2 与RMI一起工作 8.2.1 连接RMI服务 8.2.2 输出RMI服务 8.3 使用Hessian和Burlap...
通过依赖注入(DI)和面向切面编程(AOP)的核心特性,Spring帮助开发者实现业务逻辑与底层技术的解耦,从而简化了企业级应用的开发过程。 在Spring框架中,开发者可以通过配置文件或注解的方式,定义和管理应用...
7.6.1创建一个安全切面 7.6.2使用元数据保护方法 7.7小结 第8章spring和基于pojo的远程服务 8.1spring远程调用概览 8.2与rmi一起工作 8.2.1连接rmi服务 8.2.2输出rmi服务 8.3使用hessian和burlap的远程调用 ...