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

AOP(面向切面編程)

這篇具有很好參考價(jià)值的文章主要介紹了AOP(面向切面編程)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一.什么是AOP

AOP?為?Aspect Oriented Programming?的縮寫(xiě),意為:面向切面編程,通過(guò)預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)。AOP?是?OOP(面向?qū)ο缶幊蹋┑难永m(xù),是軟件開(kāi)發(fā)中的一個(gè)熱點(diǎn),也是?Spring?框架中的一個(gè)重要內(nèi)容,是函數(shù)式編程的一種衍生范型。利用?AOP?可以對(duì)業(yè)務(wù)邏輯的各個(gè)部分進(jìn)行隔離,從而使得業(yè)務(wù)邏輯各部分之間的耦合度降低,使用AOP進(jìn)行編程,可以降低代碼的侵入性,提高程序的可重用性,同時(shí)提高了開(kāi)發(fā)的效率。

簡(jiǎn)單來(lái)說(shuō),aop是一種是一種思想和和規(guī)范,通過(guò)選擇不同方法(可以在不同類(lèi))在不同時(shí)機(jī)(方法執(zhí)行前、執(zhí)行后、返回前后、拋出異常后...),對(duì)選擇的方法統(tǒng)一添加處理邏輯。

springAOP是對(duì)AOP思想的一種具體實(shí)現(xiàn),但是它只實(shí)現(xiàn)了對(duì)方法的增強(qiáng),沒(méi)有實(shí)現(xiàn)對(duì)屬性的增強(qiáng)

二.AOP的典型應(yīng)用場(chǎng)景

  • 統(tǒng)一的日志記錄?
  • 統(tǒng)一的方法執(zhí)行時(shí)間統(tǒng)計(jì)
  • 統(tǒng)一的返回格式設(shè)置
  • 統(tǒng)一的異常處理
  • 事務(wù)的開(kāi)啟和提交

三.關(guān)于AOP的核心知識(shí)點(diǎn)

切面類(lèi):定義一個(gè)類(lèi)來(lái)組織方法增強(qiáng)的邏輯(內(nèi)部由切點(diǎn)和通知組成)

切點(diǎn)(PointCut):定義要增強(qiáng)的方法(確定增強(qiáng)的范圍)

Pointcut 的作用就是提供一組規(guī)則(使用 AspectJ pointcut expression language 來(lái)描述)來(lái)匹配 Join Point,給滿(mǎn)足規(guī)則的 Join Point 添加 Advice

通知:定義方法增強(qiáng)的實(shí)現(xiàn)邏輯(定義何時(shí)增強(qiáng)以及如何增強(qiáng))

定義了切面是什么,何時(shí)使用,其描述了切面要完成的工作,還解決何時(shí)執(zhí)行這個(gè)工作的問(wèn)題。

切點(diǎn)表達(dá)式說(shuō)明

AspectJ 支持三種通配符:
* :匹配任意字符,只匹配一個(gè)元素(包,類(lèi),或方法,方法參數(shù))。
* .. :匹配任意字符,可以匹配多個(gè)元素 ,在表示類(lèi)時(shí),必須和 * 聯(lián)合使用。
+ :表示按照類(lèi)型匹配指定類(lèi)的所有類(lèi),必須跟在類(lèi)名后面,如 com.cad.Car+ , 表示繼承該類(lèi)的所有子
類(lèi)包括本身。
切點(diǎn)表達(dá)式由切點(diǎn)函數(shù)組成,其中 execution() 是最常用的切點(diǎn)函數(shù),用來(lái)匹配方法,語(yǔ)法為:
execution(< 修飾符 >< 返回類(lèi)型 >< . 類(lèi) . 方法 ( 參數(shù) )>< 異常 >)
修飾符 異常 可以省略。
表達(dá)式示例
AOP(面向切面編程)

定義相關(guān)通知

通知定義的是被攔截的方法具體要執(zhí)行的業(yè)務(wù),比如用戶(hù)登錄權(quán)限驗(yàn)證方法就是具體要執(zhí)行的業(yè)務(wù)。Spring AOP 中,可以在方法上使用以下注解,會(huì)設(shè)置方法為通知方法,在滿(mǎn)足條件后會(huì)通知本方法進(jìn)行調(diào)用:
前置通知使用@Before:通知方法會(huì)在目標(biāo)方法調(diào)用之前執(zhí)行。
后置通知使用@After:通知方法會(huì)在目標(biāo)方法返回或者拋出異常后調(diào)用。
返回之后通知使用@AfterReturning:通知方法會(huì)在目標(biāo)方法返回后調(diào)用。
拋異常后通知使用@AfterThrowing:通知方法會(huì)在目標(biāo)方法拋出異常后調(diào)用。
環(huán)繞通知使用@Around:通知包裹了被通知的方法,在被通知的方法通知之前和調(diào)用之后執(zhí)行自定義 的行為。

四.AOP的實(shí)現(xiàn)原理

Spring AOP 是構(gòu)建在 動(dòng)態(tài)代理 基礎(chǔ)上,因此 Spring 對(duì) AOP 的支持局限于方法級(jí)別的攔截 。
Spring AOP 支持 JDK Proxy CGLIB 方式實(shí)現(xiàn)動(dòng)態(tài)代理。默認(rèn)情況下,實(shí)現(xiàn)了接口的類(lèi)(被代理類(lèi)),使用 AOP 會(huì)基于 JDK 生成代理類(lèi),沒(méi)有實(shí)現(xiàn)接口的類(lèi),會(huì)基于 CGLIB 生成代理類(lèi)。
AOP(面向切面編程)
對(duì)于使用JDK實(shí)現(xiàn)的動(dòng)態(tài)代理:代理類(lèi)和被代理類(lèi)要實(shí)現(xiàn)同一個(gè)接口,在實(shí)現(xiàn)的過(guò)程中會(huì)使用到的
?api如下:Invocationhandler,proxy.newProxyInstance
對(duì)于基于GCLIB實(shí)現(xiàn)的動(dòng)態(tài)代理:繼承原始類(lèi)(原始類(lèi)不能被final修飾),是專(zhuān)門(mén)生成代理類(lèi)的第三方框架,是基于asm字節(jié)碼框架生成的
JDK CGLIB 的區(qū)別
1. JDK 實(shí)現(xiàn),要求被代理類(lèi)必須實(shí)現(xiàn)接口,之后是通過(guò) InvocationHandler Proxy,在運(yùn)行時(shí)動(dòng)態(tài)的在 內(nèi)存中生成了代理類(lèi)對(duì)象,該代理對(duì)象是通過(guò)實(shí)現(xiàn)同樣的接口實(shí)現(xiàn)(類(lèi)似靜態(tài)代理接口實(shí)現(xiàn)的方式), 只是該代理類(lèi)是在運(yùn)行期時(shí),動(dòng)態(tài)的織入統(tǒng)一的業(yè)務(wù)邏輯字節(jié)碼來(lái)完成。
2. CGLIB 實(shí)現(xiàn),被代理類(lèi)可以不實(shí)現(xiàn)接口,是通過(guò)繼承被代理類(lèi),在運(yùn)行時(shí)動(dòng)態(tài)的生成代理類(lèi)對(duì)象。
織入( Weaving ):代理的生成時(shí)機(jī)
織入是把切面應(yīng)用到目標(biāo)對(duì)象并創(chuàng)建新的代理對(duì)象的過(guò)程,切面在指定的連接點(diǎn)被織入到目標(biāo)對(duì)象中。
在目標(biāo)對(duì)象的生命周期里有多個(gè)點(diǎn)可以進(jìn)行織入:
編譯期: 切面在目標(biāo)類(lèi)編譯時(shí)被織入。這種方式需要特殊的編譯器。 AspectJ 的織入編譯器就是以這種
方式織入切面的。
類(lèi)加載器: 切面在目標(biāo)類(lèi)加載到 JVM 時(shí)被織入。這種方式需要特殊的類(lèi)加載器( ClassLoader , 它可以 在目標(biāo)類(lèi)被引入應(yīng)用之前增強(qiáng)該目標(biāo)類(lèi)的字節(jié)碼。AspectJ5 的加載時(shí)織入( load-timeweaving. LTW
就支持以這種方式織入切面。
運(yùn)行期: 切面在應(yīng)用運(yùn)行的某一時(shí)刻被織入。一般情況下,在織入切面時(shí), AOP 容器會(huì)為目標(biāo)對(duì)象動(dòng)態(tài)創(chuàng)建一個(gè)代理對(duì)象。SpringAOP 就是以這種方式織入切面的。

五.AOP的實(shí)現(xiàn)方式

JDK和GCLIB實(shí)現(xiàn)的代理類(lèi)如下:

JDK

import org.example.demo.service.AliPayService;
import org.example.demo.service.PayService;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//動(dòng)態(tài)代理:使用JDK提供的api(InvocationHandler、Proxy實(shí)現(xiàn)),此種方式實(shí)現(xiàn),要求被代理類(lèi)必須實(shí)現(xiàn)接口
public class PayServiceJDKInvocationHandler implements InvocationHandler {
    //目標(biāo)對(duì)象即就是被代理對(duì)象
    private Object target;

    public PayServiceJDKInvocationHandler(Object target) {
        this.target = target;
    }

    //proxy代理對(duì)象
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws
            Throwable {
//1.安全檢查
        System.out.println("安全檢查");
//2.記錄日志
        System.out.println("記錄日志");
//3.時(shí)間統(tǒng)計(jì)開(kāi)始
        System.out.println("記錄開(kāi)始時(shí)間");
//通過(guò)反射調(diào)用被代理類(lèi)的方法
        Object retVal = method.invoke(target, args);
//4.時(shí)間統(tǒng)計(jì)結(jié)束
        System.out.println("記錄結(jié)束時(shí)間");
        return retVal;
    }

    public static void main(String[] args) {
        PayService target = new AliPayService();
//方法調(diào)用處理器
        InvocationHandler handler =
                new PayServiceJDKInvocationHandler(target);
//創(chuàng)建一個(gè)代理類(lèi):通過(guò)被代理類(lèi)、被代理實(shí)現(xiàn)的接口、方法調(diào)用處理器來(lái)創(chuàng)建
        PayService proxy = (PayService) Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                new Class[]{PayService.class},
                handler
        );
        proxy.pay();
    }
}

GCLIB

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import org.example.demo.service.AliPayService;
import org.example.demo.service.PayService;

import java.lang.reflect.Method;

public class PayServiceCGLIBInterceptor implements MethodInterceptor {
    //被代理對(duì)象
    private Object target;

    public PayServiceCGLIBInterceptor(Object target) {
        this.target = target;
    }

    @Override
    public Object intercept(Object o, Method method, Object[] args, MethodProxy
            methodProxy) throws Throwable {
//1.安全檢查
        System.out.println("安全檢查");
//2.記錄日志
        System.out.println("記錄日志");
//3.時(shí)間統(tǒng)計(jì)開(kāi)始
        System.out.println("記錄開(kāi)始時(shí)間");
//通過(guò)cglib的代理方法調(diào)用
        Object retVal = methodProxy.invoke(target, args);
//4.時(shí)間統(tǒng)計(jì)結(jié)束
        System.out.println("記錄結(jié)束時(shí)間");
        return retVal;
    }

    public static void main(String[] args) {
        PayService target = new AliPayService();
        PayService proxy = (PayService) Enhancer.create(target.getClass(), new
                PayServiceCGLIBInterceptor(target));
        proxy.pay();
    }
}


?

六.AOP的使用

SpringAOP在使用時(shí)主要有以下兩種使用方式:
①使用aspectj風(fēng)格的注解進(jìn)行開(kāi)發(fā):

添加依賴(lài)

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

定義通知時(shí)機(jī)和通知邏輯

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.springframework.stereotype.Component;

/**
 * @author tongchen
 * @create 2023-05-08 11:14
 */
@Aspect
//將配置加載到容器中
@Component
public class AopConfig {
    //定義切點(diǎn)
    //包后面一定要有一個(gè)空格
    @Pointcut("execution(* com.ljl..service.*Service.*(..))")
    public void pointCut(){

    }
    @Around("pointCut()")
    public Object around(ProceedingJoinPoint joinPoint){

        //pointcut匹配的方法
        try {
            Long start=System.currentTimeMillis();
            Object proceed = joinPoint.proceed();
            Long end=System.currentTimeMillis();
            System.out.println("方法運(yùn)行的時(shí)間:"+(end-start));
        } catch (Throwable e) {
            throw new RuntimeException(e);
        }
        return null;
    }

}

定義切點(diǎn)方法

import org.springframework.stereotype.Service;

import java.util.ArrayList;

/**
 * @author tongchen
 * @create 2023-05-08 11:13
 */
@Service
public class AspectService {
    public Object timeTest(){
        //模擬獲取數(shù)據(jù)庫(kù)中的數(shù)據(jù)
        return new ArrayList<Integer>();
    }
}

②定義一個(gè)類(lèi),實(shí)現(xiàn)MethodInteceptor文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-450352.html

到了這里,關(guān)于AOP(面向切面編程)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(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:面向切面編程

    在軟件開(kāi)發(fā)中,我們經(jīng)常會(huì)遇到一些橫切關(guān)注點(diǎn)(cross-cutting concerns),如日志記錄、事務(wù)管理和安全性等。這些關(guān)注點(diǎn)不屬于特定的模塊或類(lèi),而是橫跨整個(gè)應(yīng)用程序。傳統(tǒng)的面向?qū)ο缶幊谭椒ㄍ鶗?huì)將這些關(guān)注點(diǎn)與核心業(yè)務(wù)邏輯混雜在一起,導(dǎo)致代碼的可讀性和可維護(hù)性下

    2024年02月09日
    瀏覽(22)
  • Spring面向切面編程(AOP)

    Spring面向切面編程(AOP)

    AOP(Aspect Oriented Programming),即面向切面編程,利用一種稱(chēng)為\\\"橫切\(zhòng)\\"的技術(shù),剖開(kāi)封裝的對(duì)象內(nèi)部,并將那些影響了多個(gè)類(lèi)的公共行為封裝到一個(gè)可重用模塊,并將其命名為\\\"Aspect\\\",即切面。所謂\\\"切面\\\",簡(jiǎn)單說(shuō)就是那些與業(yè)務(wù)無(wú)關(guān),卻為業(yè)務(wù)模塊所共同調(diào)用的邏輯或責(zé)任封裝

    2024年02月07日
    瀏覽(31)
  • [SSM]Spring面向切面編程AOP

    [SSM]Spring面向切面編程AOP

    目錄 十五、面向切面編程AOP 15.1AOP介紹 15.2AOP的七大術(shù)語(yǔ) 15.3切點(diǎn)表達(dá)式 15.4使用Spring的AOP 15.4.1準(zhǔn)備工作 15.4.2基于AspectJ的AOP注解式開(kāi)發(fā) 15.4.3基于XML配置方式的AOP(了解) 15.5AOP的實(shí)際案例:事務(wù)處理 15.6AOP的實(shí)際案例:安全日志 IoC使軟件組件松耦合。AOP讓你能夠捕捉系統(tǒng)中經(jīng)

    2024年02月15日
    瀏覽(28)
  • Spring AOP(面向切面編程)和方法攔截

    Spring AOP(面向切面編程)和方法攔截 Spring是一款廣泛使用的Java開(kāi)發(fā)框架,提供了豐富的功能和工具,用于簡(jiǎn)化企業(yè)級(jí)應(yīng)用程序的開(kāi)發(fā)。其中一個(gè)重要的特性是面向切面編程(AOP)和方法攔截。本文將介紹Spring AOP和方法攔截的概念、工作原理以及在實(shí)際開(kāi)發(fā)中的應(yīng)用。 在軟

    2024年02月05日
    瀏覽(23)
  • 認(rèn)識(shí) spring AOP (面向切面編程) - springboot

    認(rèn)識(shí) spring AOP (面向切面編程) - springboot

    本篇介紹什么是spring AOP, AOP的優(yōu)點(diǎn),使用場(chǎng)景,spring AOP的組成,簡(jiǎn)單實(shí)現(xiàn)AOP 并 了解它的通知;如有錯(cuò)誤,請(qǐng)?jiān)谠u(píng)論區(qū)指正,讓我們一起交流,共同進(jìn)步! 本文開(kāi)始 AOP: 面向切面編程,也就是面向某一類(lèi)編程,對(duì)某一類(lèi)事情進(jìn)行統(tǒng)一處理; spring AOP: 是實(shí)現(xiàn)了AOP這種思想的一

    2024年02月14日
    瀏覽(29)
  • 12.控制反轉(zhuǎn)IOC與面向切面編程AOP

    目錄 一、IOC-控制反轉(zhuǎn)。 二、AOP-面向切面編程。 IOC(Inversion of Control)是控制反轉(zhuǎn)的縮寫(xiě),指的是將對(duì)象的創(chuàng)建過(guò)程和依賴(lài)關(guān)系的處理交給外部容器來(lái)實(shí)現(xiàn),從而實(shí)現(xiàn)對(duì)象之間的解耦。因此,IOC不是容器,是一種編程思想,將對(duì)象之間的依賴(lài)關(guān)系的處理從程序中轉(zhuǎn)移到容器(

    2023年04月09日
    瀏覽(23)
  • 切面的魔力:解密Spring AOP 面向切面編程

    切面的魔力:解密Spring AOP 面向切面編程

    目錄 一、AOP簡(jiǎn)介 1.1 什么是AOP ? 1.2?什么是面向切面編程 ? 1.3?AOP 的特點(diǎn) 二、?AOP的基本概念解讀 2.1 AOP的基本概念 2.2 AOP 概念趣事解讀 三、代碼情景演示 3.1?編寫(xiě)目標(biāo)對(duì)象(超級(jí)英雄們正常的行動(dòng)) 3.2 編寫(xiě)通知類(lèi) 3.2.1?前置通知 3.2.2 后置通知 3.2.3 異常通知 3.2.4 環(huán)繞通知

    2024年02月11日
    瀏覽(89)
  • 12AOP面向切面編程/GoF之代理模式

    12AOP面向切面編程/GoF之代理模式

    先看一個(gè)例子: 聲明一個(gè)接口: 實(shí)現(xiàn)該接口: 存在的問(wèn)題: 核心功能與邊緣功能摻雜(即計(jì)算的過(guò)程和sout摻雜) 邊緣功能盡管重復(fù),但卻大量分散,不利于管理 目標(biāo): 將重復(fù)的代碼統(tǒng)一提取,并且[[動(dòng)態(tài)插入]]到每個(gè)業(yè)務(wù)方法! 用代理模式解決: 相關(guān)術(shù)語(yǔ): 代理:將非

    2024年01月19日
    瀏覽(16)
  • JAVA:使用 Spring AOP 實(shí)現(xiàn)面向切面編程

    JAVA:使用 Spring AOP 實(shí)現(xiàn)面向切面編程

    1、簡(jiǎn)述 在現(xiàn)代的軟件開(kāi)發(fā)中,面向切面編程(AOP)是一種重要的編程范式,它允許我們將橫切關(guān)注點(diǎn)(如日志記錄、性能監(jiān)控、事務(wù)管理等)從應(yīng)用程序的核心業(yè)務(wù)邏輯中分離出來(lái),以提高代碼的模塊化和可維護(hù)性。Spring 框架提供了強(qiáng)大的 AOP 支持,使得我們可以輕松地實(shí)

    2024年04月13日
    瀏覽(31)
  • 【Java 初級(jí)】Spring核心之面向切面編程(AOP)

    【Java 初級(jí)】Spring核心之面向切面編程(AOP)

    tip:作為程序員一定學(xué)習(xí)編程之道,一定要對(duì)代碼的編寫(xiě)有追求,不能實(shí)現(xiàn)就完事了。我們應(yīng)該讓自己寫(xiě)的代碼更加優(yōu)雅,即使這會(huì)費(fèi)時(shí)費(fèi)力。 ???? 推薦: 體系化學(xué)習(xí)Java(Java面試專(zhuān)題) AOP(面向切面編程)是一種編程范式,用于將橫切關(guān)注點(diǎn)(如日志記錄、性能統(tǒng)計(jì)等

    2024年02月04日
    瀏覽(28)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包