亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解Spring Aop實(shí)現(xiàn)日志收集和重復(fù)屬性賦值

 更新時(shí)間:2024年10月11日 16:23:32   作者:王五周八  
AOP(面向切面編程)是一種編程思想,它允許開(kāi)發(fā)者將公共邏輯(如日志記錄、權(quán)限校驗(yàn)等)抽離出來(lái),使得可以更專注于業(yè)務(wù)邏輯的開(kāi)發(fā),SpringAOP通過(guò)定義切面、切入點(diǎn)、通知等概念,本文介紹Spring Aop實(shí)現(xiàn)日志收集和重復(fù)屬性賦值的相關(guān)操作,感興趣的朋友一起看看吧

Spring Aop實(shí)現(xiàn)日志收集和重復(fù)屬性賦值

簡(jiǎn)介

? AOP(Aspect-Oriented Programming),即面向切面編程,用人話說(shuō)就是把公共的邏輯抽出來(lái),讓開(kāi)發(fā)者可以更專注于業(yè)務(wù)邏輯開(kāi)發(fā)。

? 和IOC一樣,AOP也指的是一種思想。AOP思想是OOP(Object-Oriented Programming)的補(bǔ)充。OOP是面向類和對(duì)象的,但是AOP則是面向不同切面的。一個(gè)切面可以橫跨多個(gè)類和對(duì)象去操作,極大的豐富了開(kāi)發(fā)者的使用方式,提高了開(kāi)發(fā)效率。

譬如,一個(gè)訂單的創(chuàng)建,可能需要以下步驟:

  • 權(quán)限校驗(yàn)
  • 事務(wù)管理
  • 創(chuàng)建訂單
  • 日志打印

如果使用AOP思想,我們就可以把這四步當(dāng)成四個(gè)“切面”,讓業(yè)務(wù)人員專注開(kāi)發(fā)第三個(gè)切面,其他三個(gè)切面則是基礎(chǔ)的通用邏輯,統(tǒng)一交給AOP封裝和管理。

Spring AOP有如下概念:

術(shù)語(yǔ)翻譯釋義
Aspect切面切面由切入點(diǎn)和通知組成,它既包含了橫切邏輯的定義,也包括了切入點(diǎn)的定義。切面是一個(gè)橫切關(guān)注點(diǎn)的模塊化,一個(gè)切面能夠包含同一個(gè)類型的不同增強(qiáng)方法,比如說(shuō)事務(wù)處理和日志處理可以理解為兩個(gè)切面。
PointCut切入點(diǎn)切入點(diǎn)是對(duì)連接點(diǎn)進(jìn)行攔截的條件定義,決定通知應(yīng)該作用于截哪些方法。(充當(dāng)where角色,即在哪里做)
Advice通知通知定義了通過(guò)切入點(diǎn)攔截后,應(yīng)該在連接點(diǎn)做什么,是切面的具體行為。(充當(dāng)what角色,即做什么)
Target目標(biāo)對(duì)象目標(biāo)對(duì)象指將要被增強(qiáng)的對(duì)象,即包含主業(yè)務(wù)邏輯的類對(duì)象?;蛘哒f(shuō)是被一個(gè)或者多個(gè)切面所通知的對(duì)象。
JoinPoint連接點(diǎn)連接點(diǎn)是程序在運(yùn)行時(shí)的執(zhí)行點(diǎn),這個(gè)點(diǎn)可以是正在執(zhí)行的方法,或者是正在拋出的異常。因?yàn)镾pring只支持方法類型的連接點(diǎn),所以在Spring中連接點(diǎn)就是運(yùn)行時(shí)刻被攔截到的方法。連接點(diǎn)由兩個(gè)信息確定:+ 方法(表示程序執(zhí)行點(diǎn),即在哪個(gè)目標(biāo)方法)+ 相對(duì)點(diǎn)(表示方位,即目標(biāo)方法的什么位置,比如調(diào)用前,后等)
Weaving織入織入是將切面和業(yè)務(wù)邏輯對(duì)象連接起來(lái), 并創(chuàng)建通知代理的過(guò)程??椚肟梢栽诰幾g時(shí),類加載時(shí)和運(yùn)行時(shí)完成。在編譯時(shí)進(jìn)行織入就是靜態(tài)代理,而在運(yùn)行時(shí)進(jìn)行織入則是動(dòng)態(tài)代理。

對(duì)于通知類型來(lái)說(shuō):

Before Advice連接點(diǎn)執(zhí)行前執(zhí)行的邏輯
After returning advice連接點(diǎn)正常執(zhí)行(未拋出異常)后執(zhí)行的邏輯
After throwing advice連接點(diǎn)拋出異常后執(zhí)行的邏輯
After finally advice無(wú)論連接點(diǎn)是正常執(zhí)行還是拋出異常,在連接點(diǎn)執(zhí)行完畢后執(zhí)行的邏輯
Around advice該通知可以非常靈活的在方法調(diào)用前后執(zhí)行特定的邏輯

代碼實(shí)現(xiàn)

1、創(chuàng)建注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {
    String value() default "";
}

2、切面類

@Aspect
@Slf4j
@Component
public class LogAspect {
    /**
     * 切入點(diǎn)
     */
    @Pointcut("execution(* com.zh.cn.*.*.*(..)) && @annotation(com.zh.cn.annotation.Log)")
    public void LogAspect(){
    }
    @Before("LogAspect()")
    public void before(JoinPoint joinPoint){
        //收集日志系統(tǒng)
        log.info("日志收集---前置通知");
        //獲取日志收集中的實(shí)體類
        log.info("參數(shù):{}",joinPoint);
        //獲取basePojo實(shí)體類
        Object[] args = joinPoint.getArgs();
        Object entity = args[0];
        try {
            Method setUpdateTime = entity.getClass().getDeclaredMethod("setUpdateTime", Date.class);
            Method setUpdateName = entity.getClass().getDeclaredMethod("setUpdateName", String.class);
            //通過(guò)反射為對(duì)象賦值
            setUpdateTime.invoke(entity,new Date());
            setUpdateName.invoke(entity,"zh");
        } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
            throw new RuntimeException(e);
        }
        //收集日志
        //~~~~
        log.info("日志收集---后置通知");
    }
}

3、controller層

/**
 * @Description:
 * @author:<a href="2358853434@qq.com"></a> zh
 * @Create : 2024/10/5
 **/
@RestController
@RequestMapping("/order/v1")
public class OrderController {
    @Resource
    private OrderService orderService;
    @GetMapping("/update")
    public Result update() {
        Order order = new Order();
        order.setId(1292071939041697792L);
        order.setName("測(cè)試商品");
        order.setNum(128L);
        return orderService.update(order);
    }
    @GetMapping("/insert")
    public Result insert(){
        return  Result.success();
    }
}

4、service層

@Service
@Slf4j
public class OrderServiceimpl implements OrderService {
    @Resource
    RedisTemplate<String,String> redisTemplate;
    @Resource
    RedisDistributedLock redisDistributedLock;
    /**
     * 更新訂單接口
     * @param order
     * @return
     */
    @Log
    public Result update(Order order) {
        log.info("update開(kāi)始,訂單號(hào):{}",order.getId()+"order:"+order);
        //加鎖成功
        while(redisDistributedLock.tryLock("order:"+order.getId()+":"+Thread.currentThread().getId(), "requestId", 10)) {
            //執(zhí)行訂單減減
            log.info("加鎖成功"+Thread.currentThread().getId());
            redisTemplate.opsForValue().set("order:"+order.getId(), order.toString());
            break;
        }
        if (redisDistributedLock.unlock("order:"+order.getId()+":"+Thread.currentThread().getId(),"requestId")) {
            log.info("update結(jié)束,訂單號(hào):{}",order.getId());
            return Result.success();
        }
        return Result.error("下單失敗");
    }
}

5、測(cè)試 測(cè)試用例

由于項(xiàng)目中加了spring-security的相關(guān)依賴,需要配置Authorization,不需要的友友請(qǐng)自行刪除

GET http://localhost:19002/order/v1/update
Authorization: Basic cm9vdDpyb290

結(jié)果

到此這篇關(guān)于Spring Aop實(shí)現(xiàn)日志收集和重復(fù)屬性賦值的文章就介紹到這了,更多相關(guān)Mysql全文檢索內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談mysql數(shù)據(jù)庫(kù)中的換行符與textarea中的換行符

    淺談mysql數(shù)據(jù)庫(kù)中的換行符與textarea中的換行符

    下面小編就為大家?guī)?lái)一篇淺談mysql數(shù)據(jù)庫(kù)中的換行符與textarea中的換行符。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-01-01
  • 利用ssh tunnel鏈接mysql服務(wù)器的方法

    利用ssh tunnel鏈接mysql服務(wù)器的方法

    這篇文章主要給大家介紹了利用ssh tunnel鏈接mysql服務(wù)器的方法,文中介紹的很詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-02-02
  • 詳解如何用SQL取出字段內(nèi)是json的數(shù)據(jù)

    詳解如何用SQL取出字段內(nèi)是json的數(shù)據(jù)

    數(shù)據(jù)庫(kù)中會(huì)遇到字段里面存的JSON結(jié)果的數(shù)據(jù),那么如果我們想直接取到JSON里的值該怎么辦呢?其實(shí)SQL自帶的函數(shù)就可解決本文就詳細(xì)的給大家介紹了如何用SQL取出字段內(nèi)是json的數(shù)據(jù),需要的朋友可以參考下
    2023-10-10
  • Mysql中日期和時(shí)間函數(shù)應(yīng)用不用求人

    Mysql中日期和時(shí)間函數(shù)應(yīng)用不用求人

    Mysql中日期和時(shí)間函數(shù)應(yīng)用不用求人,學(xué)習(xí)mysql的朋友可以參考下。
    2010-11-11
  • 一文詳解MySQL中數(shù)據(jù)表的外連接

    一文詳解MySQL中數(shù)據(jù)表的外連接

    因?yàn)?nbsp;MySQL 是關(guān)系型數(shù)據(jù)庫(kù),數(shù)據(jù)是拆分重組在多個(gè)數(shù)據(jù)表里面的。所以我們勢(shì)必要從多個(gè)數(shù)據(jù)表中提取數(shù)據(jù),通過(guò) SQL 語(yǔ)句的內(nèi)連接與外連接就能夠?qū)崿F(xiàn)多表查詢了,本文就來(lái)講講MySQL的外連接
    2022-08-08
  • Mysql Explain命令的使用與分析

    Mysql Explain命令的使用與分析

    今天小編就為大家分享一篇關(guān)于Mysql Explain命令的使用與分析,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • mysql過(guò)濾復(fù)制思路詳解

    mysql過(guò)濾復(fù)制思路詳解

    這篇文章主要介紹了mysql過(guò)濾復(fù)制的實(shí)現(xiàn)思路,主要講解了兩種思路,一種是在主庫(kù)的binlog上實(shí)現(xiàn)另一種是從庫(kù)的sql線程上實(shí)現(xiàn),具體實(shí)現(xiàn)過(guò)程跟隨小編一起看看吧
    2021-08-08
  • 解決mysql登錄錯(cuò)誤:''Access denied for user ''root''@''localhost''

    解決mysql登錄錯(cuò)誤:''Access denied for user ''root''@''localhost''

    這篇文章主要介紹了mysql登錄錯(cuò)誤:'Access denied for user 'root'@'localhost',本文給出了操作過(guò)程及注意事項(xiàng),需要的朋友可以參考下
    2019-11-11
  • MySQL正則表達(dá)式匹配查詢(含實(shí)例)

    MySQL正則表達(dá)式匹配查詢(含實(shí)例)

    MySQL中正式表達(dá)式通常被用來(lái)檢索或替換符合某個(gè)模式的文本內(nèi)容,根據(jù)指定的匹配模式匹配文中符合要求的特殊字符串,下面這篇文章主要給大家介紹了關(guān)于MySQL正則表達(dá)式匹配查詢的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • Debian中完全卸載MySQL的方法

    Debian中完全卸載MySQL的方法

    這篇文章主要介紹了Debian中完全卸載MySQL的方法,同時(shí)介紹了清理方法,可以做到徹底卸載mysql,需要的朋友可以參考下
    2014-06-06

最新評(píng)論