国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

根據(jù)aop實(shí)現(xiàn)自定義緩存注解

這篇具有很好參考價(jià)值的文章主要介紹了根據(jù)aop實(shí)現(xiàn)自定義緩存注解。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

根據(jù)aop實(shí)現(xiàn)自定義緩存注解

自定義注解

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.concurrent.TimeUnit;

/**
 * @author: yanchenyang958@hellobike.com
 * @date: 2023-07-04 11:26
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CacheAnnotation {

    /**
     * 是:全局緩存(每個(gè)用戶看到的一樣)
     * 否:對(duì)用戶維度緩存
     *
     * @return 是否為全局
     */
    boolean isGlobal();

    /**
     * 緩存時(shí)間
     *
     * @return 緩存時(shí)間
     */
    long time();

    /**
     * 緩存單位
     *
     * @return 緩存單位
     */
    TimeUnit timeUnit();

    /**
     * 緩存和參數(shù)有關(guān)
     *
     * @return 參數(shù)
     */
    boolean paramsDependent() default false;
}


切面

package com.hello.smart.analyzer.common.cache;

import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.hello.smart.analyzer.common.util.UserHolder;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

/**
 * 緩存切面
 *
 * @author: yanchenyang958@hellobike.com
 * @date: 2023-07-04 16:16
 */
@Aspect
@Component
public class CacheAspect {

    /**
     * 方法對(duì)應(yīng)的緩存
     * key:方法名
     * value:對(duì)應(yīng)的caffeine緩存
     */
    private final Map<String, Cache<String, Object>> cacheHashMap = new HashMap<>(16);

    @Pointcut("@annotation(com.hello.smart.analyzer.common.cache.CacheAnnotation)")
    public void pointcut() {
        System.out.println("進(jìn)入切面執(zhí)行");
    }

    @Around(value = "pointcut()")
    public Object AroundMethod(ProceedingJoinPoint proceedingJoinPoint) {
        MethodSignature signature = (MethodSignature) proceedingJoinPoint.getSignature();
        Method method = signature.getMethod();
        String methodName = method.getName();
        String className = method.getDeclaringClass().getName();
        String mapKey = className + methodName;
        CacheAnnotation cacheAnnotation = method.getAnnotation(CacheAnnotation.class);
        //去全局map中查找方法名對(duì)應(yīng)的caffeine緩存
        Cache<String, Object> cache = cacheHashMap.get(mapKey);
        //獲得方法名
        StringBuilder key = new StringBuilder(cacheAnnotation.isGlobal() ? mapKey : String.format("%s%s", mapKey, UserHolder.getUserEmail()));
        //如果緩存和參數(shù)值有關(guān)
        if (cacheAnnotation.paramsDependent()) {
            Object[] args = proceedingJoinPoint.getArgs();
            for (Object arg : args) {
                key.append(arg.toString());
            }
        }
        //如果緩存存在
        if (cache != null) {
            Object resp = cache.getIfPresent(key.toString());
            if (resp != null) {
                return resp;
            }
        }
        //如果緩存不存在
        try {
            Object returnObj = proceedingJoinPoint.proceed();
            if (cache == null) {
                cache = Caffeine.newBuilder()
                        .expireAfterWrite(cacheAnnotation.time(), cacheAnnotation.timeUnit())
                        .maximumSize(5000)
                        .build();
                cacheHashMap.put(mapKey, cache);
            }
            cache.put(key.toString(), returnObj);
        } catch (Throwable e) {
            throw new RuntimeException(e);
        }
        return cache.getIfPresent(key.toString());
    }
}

使用

根據(jù)aop實(shí)現(xiàn)自定義緩存注解,緩存,spring,java文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-542036.html

到了這里,關(guān)于根據(jù)aop實(shí)現(xiàn)自定義緩存注解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • spring自定義注解+aop+@BindingParam

    2.1 聲明切面注解 ?2.1.1切面對(duì)應(yīng)枚舉 ?2.2 聲明綁定參數(shù)注解 4.1 ThreadLocalUtil? 4.2? 自定義異常

    2024年02月14日
    瀏覽(19)
  • spring boot 使用AOP+自定義注解+反射實(shí)現(xiàn)操作日志記錄修改前數(shù)據(jù)和修改后對(duì)比數(shù)據(jù),并保存至日志表

    spring boot 使用AOP+自定義注解+反射實(shí)現(xiàn)操作日志記錄修改前數(shù)據(jù)和修改后對(duì)比數(shù)據(jù),并保存至日志表

    使用FieldMeta自定義注解,看個(gè)人業(yè)務(wù)自行覺(jué)得是否需要重新定義實(shí)體 實(shí)現(xiàn)類 :通過(guò)該實(shí)現(xiàn)類獲取更新前后的數(shù)據(jù)。 該實(shí)現(xiàn)類的實(shí)現(xiàn)原理為:獲取入?yún)⒊鋈氲膇d值,獲取sqlSessionFactory,通過(guò)sqlSessionFactory獲取selectByPrimaryKey()該方法,執(zhí)行該方法可獲取id對(duì)應(yīng)數(shù)據(jù)更新操作前后的數(shù)

    2024年01月23日
    瀏覽(28)
  • Spring Boot 自定義注解,AOP 切面統(tǒng)一打印出入?yún)⒄?qǐng)求日志

    Spring Boot 自定義注解,AOP 切面統(tǒng)一打印出入?yún)⒄?qǐng)求日志

    今天主要說(shuō)說(shuō)如何通過(guò)自定義注解的方式,在 Spring Boot 中來(lái)實(shí)現(xiàn) AOP 切面統(tǒng)一打印出入?yún)⑷罩尽P』锇閭兛梢允詹匾徊ā?廢話不多說(shuō),進(jìn)入正題! 在看看實(shí)現(xiàn)方法之前,我們先看下切面日志輸出效果咋樣: 從上圖中可以看到,每個(gè)對(duì)于每個(gè)請(qǐng)求,開(kāi)始與結(jié)束一目了然,并且

    2024年02月08日
    瀏覽(22)
  • spring-自定義AOP面向切面注解--統(tǒng)一切面處理-登陸信息采集

    spring-自定義AOP面向切面注解--統(tǒng)一切面處理-登陸信息采集

    2023華為OD統(tǒng)一考試(A+B卷)題庫(kù)清單-帶答案(持續(xù)更新)or2023年華為OD真題機(jī)考題庫(kù)大全-帶答案(持續(xù)更新) 1. 先寫(xiě)一個(gè)登陸記錄注解(//記錄:XXX時(shí)間,XXX姓名,XX系統(tǒng),登錄成功) 2. 寫(xiě)一個(gè)切面對(duì)注解進(jìn)行處理(業(yè)務(wù)邏輯處理,記錄登陸的信息) 3.寫(xiě)一個(gè)登錄的控制類,

    2024年02月13日
    瀏覽(17)
  • 注解實(shí)現(xiàn)(基于Spring AOP)

    切入點(diǎn)表達(dá)式 Spring AOP 支持的切入點(diǎn)主要有以下幾種: execution:用于匹配方法執(zhí)行的連接點(diǎn)。這是最常用的切入點(diǎn)指示器。你可以指定具體的方法,或者類來(lái)匹配。 例如: execution(* com.example.service.*.*(..)) ,這個(gè)表達(dá)式表示匹配 com.example.service 包下的所有類的所有方法。 wit

    2024年02月16日
    瀏覽(18)
  • javaee spring aop 注解實(shí)現(xiàn)
  • redis + AOP + 自定義注解實(shí)現(xiàn)接口限流

    限流(rate limiting) ? 是指在一定時(shí)間內(nèi),對(duì)某些資源的訪問(wèn)次數(shù)進(jìn)行限制,以避免資源被濫用或過(guò)度消耗。限流可以防止服務(wù)器崩潰、保證用戶體驗(yàn)、提高系統(tǒng)可用性。 限流的方法有很多種,常見(jiàn)的有以下幾種: 漏桶算法: ?漏桶算法通過(guò)一個(gè)固定大小的漏桶來(lái)模擬流量

    2024年02月03日
    瀏覽(22)
  • Spring Boot入門(23):記錄接口日志再也不難!用AOP和自定義注解給Spring Boot加上日志攔截器!

    Spring Boot入門(23):記錄接口日志再也不難!用AOP和自定義注解給Spring Boot加上日志攔截器!

    ? ? ? ? 在上兩期中,我們著重介紹了如何集成使用 Logback?與?log4j2?日志框架的使用,今天我們講解的主題依舊跟日志有關(guān),不過(guò)不是使用何種開(kāi)源框架,而是自己動(dòng)手造。 ? ? ? ? Spring的核心之一AOP;AOP翻譯過(guò)來(lái)叫面向切面編程, 核心就是這個(gè)切面. 切面表示從業(yè)務(wù)邏輯中

    2024年02月11日
    瀏覽(25)
  • springboot自定義注解+aop+redis實(shí)現(xiàn)延時(shí)雙刪

    springboot自定義注解+aop+redis實(shí)現(xiàn)延時(shí)雙刪

    redis作為用的非常多的緩存數(shù)據(jù)庫(kù),在多線程場(chǎng)景下,可能會(huì)出現(xiàn)數(shù)據(jù)庫(kù)與redis數(shù)據(jù)不一致的現(xiàn)象 數(shù)據(jù)不一致的現(xiàn)象:https://blog.csdn.net/m0_73700925/article/details/133447466 這里采用aop+redis來(lái)解決這個(gè)方法: 刪除緩存 更新數(shù)據(jù)庫(kù) 延時(shí)一定時(shí)間,比如500ms 刪除緩存 這里之所以要延時(shí)一

    2024年01月17日
    瀏覽(21)
  • springboot3使用自定義注解+AOP+redis優(yōu)雅實(shí)現(xiàn)防重復(fù)提交

    springboot3使用自定義注解+AOP+redis優(yōu)雅實(shí)現(xiàn)防重復(fù)提交

    ? ??個(gè)人主頁(yè):? ? ?蒾酒 ?? 系列專欄 :《spring boot實(shí)戰(zhàn)》 ?? 山高路遠(yuǎn),行路漫漫,終有歸途 目錄 寫(xiě)在前面 實(shí)現(xiàn)思路 實(shí)現(xiàn)步驟 1.定義防重復(fù)提交注解 2.編寫(xiě)一個(gè)切面去發(fā)現(xiàn)該注解然后執(zhí)行防重復(fù)提交邏輯 3.測(cè)試 依賴條件 1.接口上標(biāo)記防重復(fù)提交注解 2.接口測(cè)試 寫(xiě)在最

    2024年04月11日
    瀏覽(23)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包