国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - Java開發框架spring實現自定義緩存標簽

Java開發框架spring實現自定義緩存標簽

2020-03-11 13:48txxs JAVA教程

這篇文章主要介紹了Java開發框架spring實現自定義緩存標簽的詳細代碼,感興趣的小伙伴們可以參考一下

自從spring3.1之后,spring引入了抽象緩存,可以通過在方法上添加@Cacheable等標簽對方法返回的數據進行緩存。但是它到底是怎么實現的呢,我們通過一個例子來看一下。首先我們定義一個@MyCacheable

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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{
 
}

然后定義處理MyCacheable的切面

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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;
  }
 
}

上述代碼展示了如何處理MyCacheable自定義的標簽,以及默認情況下產生key值的規則。最后生成的key值大概是這個樣子:caching.aspectj.Calculator.sum(Integer=1;Integer=2;)
下邊這段代碼在方法上添加了MyCacheable標簽

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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;
  }
}

在方法上加了MyCacheable標簽,當key值相同的情況下會直接在緩存中獲取數據,如果沒有相同的key值,則會重新計算,因為這里只是一個加和操作,耗時非常的短暫。我們在這里讓其睡眠3秒鐘。
我們在spring-config.xml配置如下:

?
1
2
3
4
5
6
7
8
9
10
<?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>

測試類:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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!");
  }
 
}

我們看一下運行的結果:

Java開發框架spring實現自定義緩存標簽

從結果來看第一次直接計算結果,第二次從緩存中獲取。

以上就是spring實現自定義緩存標簽的全部內容,希望對大家的學習有所幫助

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 免费一级毛片 | 91视频免费观看 | 午夜成人免费影院 | 亚洲va国产va天堂va久久 | 亚洲欧洲久久 | 午夜色电影 | 色综合久久久久久久久久久 | 免费国产一区 | 国产一区二区三区 | 啪啪导航 | 国产福利91精品一区二区三区 | 韩日一区二区 | av网站地址| 亚洲一区二区在线播放 | 中文字幕在线视频观看 | 色播视频网站 | 日韩影院一区 | 日韩成人在线影院 | 精品美女久久久 | 黄色片视频免费观看 | 污视频在线观看免费 | 国产视频久久久久久久 | 亚洲精品专区 | 精品www | 久久黄色 | 色婷婷久久一区二区三区麻豆 | 巴西性猛交xxxx免费看久久久 | 亚洲免费片 | 国产一区二区精品 | 精品国产乱码久久久久久1区2区 | 日本精品一区 | 日韩不卡 | 久久精品夜夜夜夜夜久久 | 精品天堂| 国产毛片视频 | 日韩蜜桃 | 久久久夜色精品亚洲 | 亚洲欧美日韩国产 | 在线观看视频黄 | 日韩成人不卡 | 国产四区|