- 浏览: 3424408 次
- 性别:
- 来自: 珠海
文章分类
- 全部博客 (1633)
- Java (250)
- Android&HTML5 (111)
- Struts (10)
- Spring (236)
- Hibernate&MyBatis (115)
- SSH (49)
- jQuery插件收集 (55)
- Javascript (145)
- PHP (77)
- REST&WebService (18)
- BIRT (27)
- .NET (7)
- Database (105)
- 设计模式 (16)
- 自动化和测试 (19)
- Maven&Ant (43)
- 工作流 (36)
- 开源应用 (156)
- 其他 (16)
- 前台&美工 (119)
- 工作积累 (0)
- OS&Docker (83)
- Python&爬虫 (28)
- 工具软件 (157)
- 问题收集 (61)
- OFbiz (6)
- noSQL (12)
最新评论
-
HEZR曾嶸:
你好博主,这个不是很理解,能解释一下嘛//左边+1,上边+1, ...
java 两字符串相似度计算算法 -
天使建站:
写得不错,可以看这里,和这里的这篇文章一起看,有 ...
jquery 遍历对象、数组、集合 -
xue88ming:
很有用,谢谢
@PathVariable映射出现错误: Name for argument type -
jnjeC:
厉害,困扰了我很久
MyBatis排序时使用order by 动态参数时需要注意,用$而不是# -
TopLongMan:
非常好,很实用啊。。
PostgreSQL递归查询实现树状结构查询
缓存方法 : Srping+Ehcache 在Service层配置缓存 http://panyongzheng.iteye.com/blog/2234167
AOP面向切入实现service层嵌入缓存 http://my.oschina.net/vill/blog/550715
使用,在service调用前使用:
转载请声明。
AOP面向切入实现service层嵌入缓存 http://my.oschina.net/vill/blog/550715
//放入缓存注解 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @Inherited public @interface Cacheable { //放入 String key(); //缓存key String fieldKey();// field值 int expireTime() default 3600; } //从缓存中销毁注解 @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface CacheEvict { //销毁 String key(); String[] fieldKey(); int expireTime() default 3600; } Aspect类 //环绕切入 @Around(value = "@annotation(com.xx.cache.annotation.Cacheable)") public Object cache(ProceedingJoinPoint pjp) { Object result = null; Method method = getMethod(pjp); Cacheable cacheable = method.getAnnotation(Cacheable.class); String fieldKey = cacheable.fieldKey(); if (cacheable.fieldKey().indexOf("#") == 0) {//动态变量存入方式 fieldKey = parseKey(cacheable.fieldKey(), method, pjp.getArgs()); } if (useCache) {//判断是否开启缓存 开启缓存 从缓存获取 result //获取方法的返回类型,让缓存可以返回正确的类型 Class returnType = ((MethodSignature) pjp.getSignature()).getReturnType(); //使用redis 的hash进行存取,易于管理 // result = JedisUtils.hget(cacheable.key(), fieldKey,method.getReturnType()); result = JedisUtils.hget(cacheable.key(), fieldKey, returnType); if (result == null) { try { result = pjp.proceed(); // Assert.notNull(fieldKey); JedisUtils.hset(cacheable.key(), fieldKey, result); logger.debug("The " + cacheable.key() + " add to redis, the fieldKey is " + fieldKey); } catch (Throwable e) { e.printStackTrace(); } } return result; } try { return pjp.proceed(); } catch (Throwable throwable) { throwable.printStackTrace(); return null; } } //环绕切入 @Around(value = "@annotation(com.xx.cache.annotation.CacheEvict)") public Object evict(ProceedingJoinPoint pjp) { //和cache类似,使用Jedis.hdel()删除缓存即可 if (useCache) {//判断是否开启缓存 Method method = getMethod(pjp); CacheEvict cacheEvict = method.getAnnotation(CacheEvict.class); String[] fieldKeys = cacheEvict.fieldKey(); int deleteSuccessFlag = 0; for (String fieldKey : fieldKeys) { if (fieldKey.indexOf("#") == 0) {//动态变量存入方式 String t = fieldKey; fieldKey = parseKey(fieldKey, method, pjp.getArgs()); if (fieldKey == null) { logger.error("cache evict fieldkey {} connot be null, that may be cause data connot sync ", t); t = null; } } deleteSuccessFlag += JedisUtils.hdel(cacheEvict.key(), fieldKey == null ? "" : fieldKey); logger.debug("The reference fieldkey: " + fieldKey + " for " + cacheEvict.key() + " has been delete from redis"); } logger.debug("Delete " + deleteSuccessFlag + " " + cacheEvict.key() + "from redis"); } try { return pjp.proceed(); } catch (Throwable e) { e.printStackTrace(); return null; } } /** * 获取缓存的key * key 定义在注解上,支持SPEL表达式 * * @param key * @param method * @param args * @return */ private String parseKey(String key, Method method, Object[] args) { //获取被拦截方法参数名列表(使用Spring支持类库) LocalVariableTableParameterNameDiscoverer u = new LocalVariableTableParameterNameDiscoverer(); String[] paraNameArr = u.getParameterNames(method); //使用SPEL进行key的解析 ExpressionParser parser = new SpelExpressionParser(); //SPEL上下文 StandardEvaluationContext context = new StandardEvaluationContext(); //把方法参数放入SPEL上下文中 for (int i = 0; i < paraNameArr.length; i++) { context.setVariable(paraNameArr[i], args[i]); } return parser.parseExpression(key).getValue(context, String.class); }
使用,在service调用前使用:
@Cacheable(key = "biz_member",fieldKey = "#id") public Member get(String id) { return super.get(id); } @CacheEvict(key = "member",fieldKey = {"#member.id","#member.account"}) public Serializable save(Member member) { return dao.insert(member); } @CacheEvict(key = "member",fieldKey = {"#member.id","#member.account"}) public void delete(Member member) { dao.delete(member); }
转载请声明。
发表评论
-
Spring Boot 属性配置
2016-06-24 11:04 1183Spring Boot 属性配置和使用 http://blog ... -
Spring Boot 集成MyBatis
2016-06-24 10:55 2028Spring Boot 集成MyBatis http://bl ... -
Spring MVC防重复提交
2016-06-17 15:47 1646http://my.oschina.net/zyqjustin ... -
Spring容器加载完之后执行特定任务
2016-06-17 15:36 2288http://my.oschina.net/simpleton ... -
使用spring-session和shiro来代理session的配置
2016-06-16 11:21 12060使用spring-session和redis来代理sessio ... -
JSTL 的 if else : 有 c:if 没有 else 的处理
2016-06-14 09:52 1337http://blog.csdn.net/xiyuan1999 ... -
spring mvc 请求转发和重定向
2016-06-14 09:48 1400http://blog.csdn.net/jackpk/art ... -
mvc:view-controller
2016-05-18 10:26 1084http://blog.csdn.net/lzwglory/a ... -
spring配置事物的方式:注解和aop配置
2016-05-14 00:26 4104参考: Spring AOP中pointcut express ... -
分布式任务调度组件 Uncode-Schedule
2016-05-13 14:47 2287http://www.oschina.net/p/uncode ... -
Mybatis分库分表扩展插件
2016-05-12 15:47 1625http://fangjialong.iteye.com/bl ... -
spring+mybatis+atomikos 实现JTA事务
2016-05-11 22:00 5524sping配置多个数据源 不同用户操作不同数据库 http:/ ... -
Spring中使用注解 @Scheduled执行定时任务
2016-05-10 09:39 1567原文:http://dwf07223.blog.51cto.c ... -
Spring中配置Websocket
2016-05-05 16:55 1278spring+websocket整合(springMVC+sp ... -
redis 集群中Session解决方案之Spring Session
2016-05-04 08:54 1316集群中Session解决方案之Spring Session h ... -
使用Spring-data进行Redis操作
2016-05-04 08:54 4795使用Spring-data进行Redis操作 http://z ... -
Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC
2016-05-03 13:35 1062Spring4新特性——集成Bean Validation 1 ... -
SpringMVC介绍之Validation
2016-05-03 13:10 985SpringMVC介绍之Validation http://h ... -
spring 注解方式下使用commons-validator 验证表单
2016-05-03 11:08 3078原文: http://www.programgo.com/ar ... -
Spring MVC学习详解
2016-04-28 09:13 1004原文 http://blog.csdn.net/alsocod ...
相关推荐
这个也是网上说的面向切面编程AOP。 AOP的概念也很好理解,跟中间件差不多,说白了,就是我可以任意地在方法的前面或后面添加代码,这很适合用于缓存、日志等处理。 在net core2.2时,我当时就尝试过用autofac实现...
在IT行业中,Spring AOP(面向切面编程)和EhCache是两个非常重要的概念,它们在提升应用程序性能和管理缓存方面发挥着关键作用。本文将深入探讨如何结合Spring AOP与EhCache实现一个简单的缓存实例,以便优化Java...
在Spring AOP(面向切面编程)中,自定义缓存是一种常见的优化技术,它可以显著提高应用程序的性能,减少对数据库或远程服务的重复访问。本实例将介绍如何利用Spring AOP来实现自定义缓存功能。 首先,理解Spring ...
在Spring AOP(面向切面编程)中,切入点表达式是定义通知(advice)执行时机的关键元素。本文将深入探讨9种不同的切入点表达式及其用法,通过实际的示例代码来帮助理解它们的工作原理。 1. **execute()**: `...
### AOP面向切面编程详解 #### 一、AOP概览 AOP(Aspect-Oriented Programming,面向切面编程)是一种编程思想和技术,它作为OOP(面向对象编程)的一种补充,主要解决了OOP在处理横切关注点方面的不足。在传统的...
Spring AOP,全称Aspect-Oriented Programming(面向切面编程),是Spring框架的重要组成部分,它为应用程序提供了声明式的企业级服务,如日志、事务管理等。在本项目中,我们将探讨如何通过配置文件实现Spring AOP...
Spring AOP是在Spring框架的基础上实现的一种面向方面编程机制。 1. **方面(Aspect)**:这是AOP的核心概念之一,指代一个关注点的模块化,该关注点可能会横切多个对象。例如事务管理就是一个典型的横切关注点,...
在IT行业中,Spring框架是Java企业级应用开发的首选,其强大的功能之一就是AOP(面向切面编程)。本文将详细解析Spring AOP的三种实现方式,帮助你深入理解这一重要概念。 首先,理解AOP的基本概念至关重要。AOP是...
Spring AOP(Aspect Oriented Programming)是Spring框架中的一个核心组件,用于实现面向切面编程。AOP是一种编程范式,旨在将横切关注点(Cross-cutting concerns)从业务逻辑中分离出来。传统的面向对象编程(OOP...
Spring AOP(面向切面编程)是Spring框架中的一个重要组件,它允许我们在不修改源代码的情况下,对程序的行为进行统一管理和增强。在这个场景中,我们将使用Spring AOP来实现一个日志记录的功能,以追踪系统中各个...
Spring AOP通过XML配置文件提供了灵活的方式来定义和管理切面、切入点和通知,使得我们可以轻松地在应用程序中实现横切关注点的解耦。了解和掌握Spring AOP的配置实现,有助于提升我们构建松散耦合、易于维护的系统...
本代码通过使用spring aop+ehcache的技术,实现了方法级别的查询缓存,主要原理是 方法的完整路径+方法参数值,作为key,放入cache中,下次访问时先判断cache中是否有该key.
标题 "使用Spring AOP对Web应用数据进行Memcached缓存" 涉及到的关键技术是Spring AOP(面向切面编程)和Memcached,这是一种常见的高性能、分布式内存对象缓存系统。在Web应用程序中,使用缓存可以显著提高数据访问...
**Spring AOP 面向切面编程详解** 在Java世界中,Spring框架以其强大的功能和易用性闻名,其中一个核心特性就是面向切面编程(Aspect-Oriented Programming,简称AOP)。AOP是为了解决传统面向对象编程中横切关注点...
基于注解实现SpringAop基于注解实现SpringAop基于注解实现SpringAop
整理的Spring AOP Aspect切入点语法,老师整理的,2018.08.01最新版
Spring AOP,即Aspect Oriented Programming(面向切面编程),是Spring框架的重要组成部分,它提供了一种在不修改源码的情况下对程序进行功能增强的技术。本项目实现了Spring AOP的基本概念和操作,以下是对相关...
面向切面编程(AOP)是一种编程范式,旨在将横切关注点(如日志、安全等)与业务逻辑分离,从而提高模块化。AOP通过预定义的“切面”对横切关注点进行模块化,从而可以在不修改业务逻辑代码的情况下增加新功能。动态...
AOP面向切面思想.mp4
面向切面编程(AOP,Aspect Oriented Programming)是一种编程范式,旨在将系统中的关注点分离,使得代码更加模块化,易于维护和扩展。在传统的面向对象编程(OOP)中,业务逻辑往往与日志、事务管理、权限控制等横...