package caching.springaop;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
/**
* 使用@MyCacheable注解方法
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyCacheable{
}
package caching.springaop;
import java.util.HashMap;
import java.util.Map;
import org.apache.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
/**
* 处理MyCacheable方法的切面
*/
@Aspect
public class CacheAspect {
private Logger logger = Logger.getLogger(CacheAspect.class);
private Map<String, Object> cache;
public CacheAspect() {
cache = new HashMap<String, Object>();
}
/**
* 所有标注了@Cacheable标签的方法切入点
*/
@Pointcut("execution(@MyCacheable * *.*(..))")
@SuppressWarnings("unused")
private void cache() {
}
@Around("cache()")
public Object aroundCachedMethods(ProceedingJoinPoint thisJoinPoint)
throws Throwable {
logger.debug("Execution of Cacheable method catched");
//产生缓存数据的key值,像是这个样子caching.aspectj.Calculator.sum(Integer=1;Integer=2;)
StringBuilder keyBuff = new StringBuilder();
//增加类的名字
keyBuff.append(thisJoinPoint.getTarget().getClass().getName());
//加上方法的名字
keyBuff.append(".").append(thisJoinPoint.getSignature().getName());
keyBuff.append("(");
//循环出cacheable方法的参数
for (final Object arg : thisJoinPoint.getArgs()) {
//增加参数的类型和值
keyBuff.append(arg.getClass().getSimpleName() + "=" + arg + ";");
}
keyBuff.append(")");
String key = keyBuff.toString();
logger.debug("Key = " + key);
Object result = cache.get(key);
if (result == null) {
logger.debug("Result not yet cached. Must be calculated...");
result = thisJoinPoint.proceed();
logger.info("Storing calculated value '" + result + "' to cache");
cache.put(key, result);
} else {
logger.debug("Result '" + result + "' was found in cache");
return result;
}
}
package caching.springaop;
import org.apache.log4j.Logger;
public class Calculator {
private Logger logger = Logger.getLogger(Calculator.class);
@MyCacheable
public int sum(int a, int b) {
logger.info("Calculating " + a + " + " + b);
try {
//假设这是代价非常高的计算
Thread.sleep(3000);
} catch (InterruptedException e) {
logger.error("Something went wrong...", e);
}
return a + b;
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<aop:aspectj-autoproxy />
<bean class="caching.springaop.CacheAspect" />
<bean id="calc" class="caching.springaop.Calculator" />
</beans>
package caching.springaop;
import org.apache.log4j.Logger;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* 使用SpringAOP缓存的简单例子
* @author txxs
*/
public class App {
private static Logger logger = Logger.getLogger(App.class);
public static void main(String[] args) {
logger.debug("Starting...");
ApplicationContext ctx = new ClassPathXmlApplicationContext("spring-config.xml");
Calculator calc = (Calculator) ctx.getBean("calc");
//计算出来的结果将会被存储在cache
logger.info("1 + 2 = " + calc.sum(1, 2));
//从缓存中获取结果
logger.info("1 + 2 = " + calc.sum(1, 2));
logger.debug("Finished!");
}
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有