最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring?BOOT?AOP基礎應用教程

 更新時間:2022年07月05日 10:11:26   作者:上后左愛  
這篇文章主要介紹了Spring?BOOT?AOP的使用,文章從相關問題展開全文內容詳情,具有一定的參考價值,需要的小伙伴可以參考一下

面試課題 Spring boot AOP

Spring boot 中 AOP是其中 重要的特性,其實現(xiàn)的方式借助的攔截器 + Proxy 動態(tài)代理,在AOP主要用于日志打印,安全攔截,事務處理,異常處理和性能統(tǒng)計,要向深刻了解Spring boot AOP 原理,從 Spring 動態(tài)代理的原理講起

Spring boot 動態(tài)代理

原理:

動態(tài)代理底層實現(xiàn)借助 java.lang.reflect.Proxy 的 newProxyInstance的方法

其有是三個參數(shù):

1.Class的類加載器

2.接口方法

3.h 增強方式

在代碼中 定于 interface , interfaceImpl 具體的實現(xiàn)類 ,使用 java 代理代碼方式進行處理:

 Proxy.newProxyInstance(Main.Class.getClassLoader(), new Class[] {UserDao.class}, new InvocationHandler() {
})
//在 InvocationHandler()  調用方法之前增強添加預處理 和 方法調用后的處理東西
public interface UserDao {
    public int add(int a, int b);
}
public class UserDaoImpl implements UserDao {
    @Override
    public int add(int a, int b) {
        System.out.println("add 方法執(zhí)行了");
        return a+b;
    }
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
public class Main {
    public static void main(String[] args) {
        Class[] interfaces = {UserDao.class};
        UserDaoImpl userDaoImpl = new UserDaoImpl();
        //創(chuàng)建接口實現(xiàn)類代理對象
        //此處用UserDao作為返回值的類型,是因為我們傳入的interfaces就是UserDao.class
        UserDao dao = (UserDao) Proxy.newProxyInstance(Main.class.getClassLoader(), interfaces, new InvocationHandler() {
            //把想要代理的對象傳遞進來
            private Object object = userDaoImpl;
            //增強的邏輯
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //方法之前
                System.out.println("方法之前執(zhí)行 : " + method.getName() + "; 傳遞的參數(shù):" + Arrays.toString(args) + "; object:" + object);
                //被增強的方法執(zhí)行,填寫要增強的對象、參數(shù)
                Object res = method.invoke(object, args);
                //方法之后
                System.out.println("方法之后執(zhí)行 : " + method.getName() + "; 傳遞的參數(shù):" + Arrays.toString(args) + "; object:" + object);

                return res;
            }
        });
        int res = dao.add(1, 2);
        System.out.println("這個是res: " + res);
    }
}

總結

Spring boot中 能夠實現(xiàn)AOP的底層原理,之上的代碼屬于靜態(tài)編碼方式 ,需要相同的邏輯抽象出來,因此誕生了AOP,在Spring boot中 動態(tài)代理有兩種

基于接口的JDK-動態(tài)代理(返回類型屬于接口類型);

基于父類的cglib 代理,通過繼承關系代理(不管是接口還是實現(xiàn)類 OK)

在實際使用過程中 Spring boot 默認 cglib動態(tài)代理 ,使用范圍更加廣泛

AOP 切面

基本知識

  • pointcut: 切入點: execution… 表示需要在哪些方法上生效,對哪些方法進行增強 – 使用正則表達式
  • Advice: 通知: 自定義處理 ,通知 分為BeforAdvice, AfterAdvice, ThrowAdvice
  • Advisor: 將 PointCut 與 Advice 進行連接起來定義哪些通知在哪些方法增強生效 – 對切面XXAOP 使用@Ascpect 注解進行生效定義
@Component
@Aspect
public class BookAop {
    // 定義切入點
    public static final String POINT_CUT = "execution(* com.example.bootaop.dao..*.*(..))";
    @Before(POINT_CUT)
    public void before() {
        System.out.println("----------添加圖書方法前[校驗]-----------");
    }
    @After(POINT_CUT)
    public void after(JoinPoint jp) {
        System.out.println("----------添加圖書成功后-----------");
        System.out.println(jp.getTarget().getClass());
        System.out.println(Arrays.asList(jp.getArgs()));
    }
}

自定義注解

如上顯示是 AOP的切面,但是AOP切面有個使用不好定法在于 pointcut 寫正則表達式 無法準確的表達,最好有個插拔式方式 ,引入到自定義注解,自定義注解彌補這一缺陷

元注解

元注解是 java 自帶的類型

@Retention 注解 保留策略(SOURCE,CLASS,RUNTIME)

@Retention(RetentionPolicy.SOURCE) 僅存在于源碼中

@Retention(RetentionPolicy.CLASS) 存在于class字節(jié)碼中,但運行時無法獲取

@Retention(RetentionPolicy.RUNTIME) 存在于class字節(jié)碼中,運行時可以通過反射獲取

Target 注解 作用范圍

@Target(ElementType.TYPE) 接口、類等

@Target(ElementType.FIELD) 字段

@Target(ElementType.METHOD) 方法

@Target(ElementType.PARAMETER) 方法參數(shù)

@Target(ElementType.CONSTRUCTOR) 構造函數(shù)

@Target(ElementType.LOCAL_VARIABLE) 局部變量

@Target(ElementType.ANNOTATION_TYPE) 注解

@Target(ElementType.PACKAGE) 包

自定義注解

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

如何在AOP引用

在 pointcut = “@annotation(MyLog)”

@Slf4j
@Aspect
@Component
public class LogAspect {
    @Around("@annotation(myLog)")
    public Object around(ProceedingJoinPoint point, MyLog myLog) throws Throwable{
        String className = point.getTarget().getClass().getName();
        String methodName = point.getSignature().getName();
        String value = myLog.value();
        log.info("類名:{},方法名:{},注解值:{}",className,methodName,value);
        log.info("方法之前執(zhí)行");
        long startTime = System.currentTimeMillis();
        Object proceed = point.proceed();
        long endTime = System.currentTimeMillis();
        long time = endTime - startTime;
        log.info("方法之后執(zhí)行");
        log.info("方法耗時:{}", time);
        return proceed;
    }
}

到此這篇關于Spring BOOT AOP基礎應用教程的文章就介紹到這了,更多相關Spring BOOT AOP內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java中如何獲取當前服務器的IP地址

    Java中如何獲取當前服務器的IP地址

    這篇文章主要給大家介紹了關于Java中如何獲取當前服務器的IP地址的相關資料,我們可以使用Java中的InetAddress類來獲取Linux服務器的IP地址,需要的朋友可以參考下
    2023-07-07
  • Java接口RandomAccess全面了解

    Java接口RandomAccess全面了解

    下面小編就為大家?guī)硪黄狫ava接口RandomAccess全面了解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • spring?boot?Mybatis?攔截器實現(xiàn)拼接sql和修改的代碼詳解

    spring?boot?Mybatis?攔截器實現(xiàn)拼接sql和修改的代碼詳解

    這篇文章主要介紹了spring?boot?Mybatis?攔截器實現(xiàn)拼接sql和修改,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • jvm-jstack常用的用法示例

    jvm-jstack常用的用法示例

    jstack 是一個常用的用于分析 Java 進程的工具。它可以顯示 Java 進程中所有線程狀態(tài)和堆棧信息,幫助定位 Java 進程中的問題,這篇文章主要介紹了jvm-jstack常用的用法示例,需要的朋友可以參考下
    2023-06-06
  • 一文讀懂Jvm類加載機制

    一文讀懂Jvm類加載機制

    這篇文章主要介紹了一文讀懂Jvm類加載機制,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07
  • Java Hibernate使用SessionFactory創(chuàng)建Session案例詳解

    Java Hibernate使用SessionFactory創(chuàng)建Session案例詳解

    這篇文章主要介紹了Java Hibernate使用SessionFactory創(chuàng)建Session案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-08-08
  • java如何寫接口給別人調用的示例代碼

    java如何寫接口給別人調用的示例代碼

    這篇文章主要介紹了java如何寫接口給別人調用的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • 解讀為何java中的boolean類型是32位的

    解讀為何java中的boolean類型是32位的

    這篇文章主要介紹了為何java中的boolean類型是32位的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • idea打包java程序(包含依賴的所有jar包)

    idea打包java程序(包含依賴的所有jar包)

    這篇文章主要介紹了idea打包java程序(包含依賴的所有jar包),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • Java中對象的銷毀方法分析

    Java中對象的銷毀方法分析

    這篇文章主要介紹了Java中對象的銷毀方法,較為詳細的分析了對象的功能、用法及銷毀對象對于程序運行的益處,需要的朋友可以參考下
    2015-04-04

最新評論

桦甸市| 湖北省| 盖州市| 句容市| 南江县| 孝感市| 科技| 左云县| 民县| 四会市| 永修县| 恩平市| 柏乡县| 英超| 平泉县| 道真| 左云县| 平利县| 宝兴县| 昔阳县| 利川市| 赫章县| 哈密市| 苍梧县| 红安县| 盐池县| 驻马店市| 新沂市| 西贡区| 义马市| 梅州市| 噶尔县| 丹棱县| 阜城县| 石楼县| 剑阁县| 涟水县| 莱芜市| 吉水县| 萨嘎县| 福鼎市|