欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springAop實(shí)現(xiàn)講解(看這篇夠了)

 更新時(shí)間:2024年02月04日 10:43:49   作者:screamn  
AOP面向切面編程是一種編程范式,它通過將通用的橫切關(guān)注點(diǎn)(如日志、事務(wù)、權(quán)限控制等)與業(yè)務(wù)邏輯分離,使得代碼更加清晰、簡(jiǎn)潔、易于維護(hù),這篇文章主要介紹了springAop實(shí)現(xiàn)講解(看這篇夠了),需要的朋友可以參考下

依賴準(zhǔn)備

  • spring-context: 包含Spring的核心功能和上下文支持。
  • spring-aop: 提供了面向切面編程的支持。

spring-context: 包含Spring的核心功能和上下文支持。spring-aop: 提供了面向切面編程的支持。

什么是代理?

二十三種設(shè)計(jì)模式中的一種,屬于結(jié)構(gòu)型模式。它的作用就是通過提供一個(gè)代理類,讓我們?cè)谡{(diào)用目標(biāo)方法的時(shí)候,不再是直接對(duì)目標(biāo)方法進(jìn)行調(diào)用,而是通過代理類間接調(diào)用。讓不屬于目標(biāo)方法核心邏輯的代碼從目標(biāo)方法中剝離出來——解耦。調(diào)用目標(biāo)方法時(shí)先調(diào)用代理對(duì)象的方法,減少對(duì)目標(biāo)方法的調(diào)用和打擾,同時(shí)讓附加功能能夠集中在一起也有利于統(tǒng)一維護(hù)。

在這里插入圖片描述

舉例:

楊超越是一個(gè)明星,她會(huì)唱歌和跳舞,她現(xiàn)在想要舉辦一場(chǎng)演唱會(huì),那么需要場(chǎng)地的租用和場(chǎng)地搭建這個(gè)環(huán)境的準(zhǔn)備,已經(jīng)后續(xù)的拆除。此時(shí)對(duì)于這個(gè)演唱會(huì)核心的內(nèi)容就是明星楊超越唱歌,跳舞,那么非核心的內(nèi)容就是場(chǎng)地的搭建,拆除,租用等等,這時(shí)候?qū)畛絹碚f,我只會(huì)唱歌跳舞,這方面的我不會(huì),所以此時(shí)就可以讓他的經(jīng)紀(jì)人去找負(fù)責(zé)對(duì)應(yīng)業(yè)務(wù)的職員搭建和準(zhǔn)備演唱會(huì)。那么這個(gè)經(jīng)紀(jì)人就屬于代理。核心業(yè)務(wù)是跳舞唱歌,非核心業(yè)務(wù)就是演唱會(huì)的相關(guān)籌辦。 當(dāng)我們需要對(duì)核心代碼增加非核心業(yè)務(wù)的邏輯時(shí)可以采用代理的技術(shù)。

代理分類

靜態(tài)代理

靜態(tài)代理是在編譯時(shí)期就已經(jīng)確定的代理方式,在靜態(tài)代理中,需要手動(dòng)創(chuàng)建一個(gè)代理類,該代理類與被代理類實(shí)現(xiàn)相同的接口,并持有一個(gè)對(duì)被代理對(duì)象的引用。通過在代理類中調(diào)用被代理對(duì)象的方法前后加入自定義的邏輯,實(shí)現(xiàn)對(duì)目標(biāo)對(duì)象方法的增強(qiáng)或控制。

動(dòng)態(tài)代理

動(dòng)態(tài)代理是在運(yùn)行時(shí)期根據(jù)被代理對(duì)象生成代理類的方式。在動(dòng)態(tài)代理中,不需要手動(dòng)創(chuàng)建代理類,而是通過使用Java的反射機(jī)制,在運(yùn)行時(shí)動(dòng)態(tài)地創(chuàng)建代理類和代理對(duì)象。動(dòng)態(tài)代理可以代理任何實(shí)現(xiàn)了接口的類,它通過一組接口來描述被代理類的行為,并提供了一個(gè)InvocationHandler接口的實(shí)現(xiàn)類來處理代理對(duì)象的所有方法調(diào)用。在方法被調(diào)用時(shí),代理對(duì)象會(huì)將方法的調(diào)用轉(zhuǎn)發(fā)給InvocationHandler的invoke()方法,并可以在此方法中添加額外的邏輯。

實(shí)現(xiàn)方式(動(dòng)態(tài)代理)

  • JDK動(dòng)態(tài)代理:JDK原生的實(shí)現(xiàn)方式,需要被代理的目標(biāo)類必須實(shí)現(xiàn)接口!他會(huì)根據(jù)目標(biāo)類的接口動(dòng)態(tài)生成一個(gè)代理對(duì)象!代理對(duì)象和目標(biāo)對(duì)象有相同的接口!
  • cglib:通過繼承被代理的目標(biāo)類實(shí)現(xiàn)代理,所以不需要目標(biāo)類實(shí)現(xiàn)接口!

AOP 面向切面編程

它允許開發(fā)人員分離橫切關(guān)注點(diǎn)(cross-cutting concerns)和核心業(yè)務(wù)邏輯。橫切關(guān)注點(diǎn)是那些存在于應(yīng)用程序中多個(gè)模塊中的功能,例如日志記錄、性能統(tǒng)計(jì)、安全性和事務(wù)管理等。通過 AOP,這些橫切關(guān)注點(diǎn)可以被模塊化地定義,并且可以被動(dòng)態(tài)地應(yīng)用到整個(gè)應(yīng)用程序中。也就是說將核心代碼和非核心代碼分割開。

使用場(chǎng)景

  • AOP(面向切面編程)是一種編程范式,它通過將通用的橫切關(guān)注點(diǎn)(如日志、事務(wù)、權(quán)限控制等)與業(yè)務(wù)邏輯分離,使得代碼更加清晰、簡(jiǎn)潔、易于維護(hù)。AOP可以應(yīng)用于各種場(chǎng)景,以下是一些常見的AOP應(yīng)用場(chǎng)景:
  • 日志記錄:在系統(tǒng)中記錄日志是非常重要的,可以使用AOP來實(shí)現(xiàn)日志記錄的功能,可以在方法執(zhí)行前、執(zhí)行后或異常拋出時(shí)記錄日志。
  • 事務(wù)處理:在數(shù)據(jù)庫操作中使用事務(wù)可以保證數(shù)據(jù)的一致性,可以使用AOP來實(shí)現(xiàn)事務(wù)處理的功能,可以在方法開始前開啟事務(wù),在方法執(zhí)行完畢后提交或回滾事務(wù)。
  • 安全控制:在系統(tǒng)中包含某些需要安全控制的操作,如登錄、修改密碼、授權(quán)等,可以使用AOP來實(shí)現(xiàn)安全控制的功能。可以在方法執(zhí)行前進(jìn)行權(quán)限判斷,如果用戶沒有權(quán)限,則拋出異?;蜣D(zhuǎn)向到錯(cuò)誤頁面,以防止未經(jīng)授權(quán)的訪問。
  • 性能監(jiān)控:在系統(tǒng)運(yùn)行過程中,有時(shí)需要對(duì)某些方法的性能進(jìn)行監(jiān)控,以找到系統(tǒng)的瓶頸并進(jìn)行優(yōu)化??梢允褂肁OP來實(shí)現(xiàn)性能監(jiān)控的功能,可以在方法執(zhí)行前記錄時(shí)間戳,在方法執(zhí)行完畢后計(jì)算方法執(zhí)行時(shí)間并輸出到日志中。
  • 異常處理:系統(tǒng)中可能出現(xiàn)各種異常情況,如空指針異常、數(shù)據(jù)庫連接異常等,可以使用AOP來實(shí)現(xiàn)異常處理的功能,在方法執(zhí)行過程中,如果出現(xiàn)異常,則進(jìn)行異常處理(如記錄日志、發(fā)送郵件等)。
  • 緩存控制:在系統(tǒng)中有些數(shù)據(jù)可以緩存起來以提高訪問速度,可以使用AOP來實(shí)現(xiàn)緩存控制的功能,可以在方法執(zhí)行前查詢緩存中是否有數(shù)據(jù),如果有則返回,否則執(zhí)行方法并將方法返回值存入緩存中。
  • 動(dòng)態(tài)代理:AOP的實(shí)現(xiàn)方式之一是通過動(dòng)態(tài)代理,可以代理某個(gè)類的所有方法,用于實(shí)現(xiàn)各種功能。

Aop名詞介紹

  • 切面(Aspect):橫跨多個(gè)對(duì)象的關(guān)注點(diǎn),如日志記錄、安全控制等。切面由切點(diǎn)和通知組成。
  • 連接點(diǎn)(Join Point):程序執(zhí)行過程中能夠插入切面的點(diǎn),如方法調(diào)用、異常處理等。
  • 切點(diǎn)(Pointcut):對(duì)連接點(diǎn)進(jìn)行攔截的定義,如攔截某個(gè)包下的所有方法調(diào)用。
  • 通知(Advice):切面在連接點(diǎn)處執(zhí)行的操作,如在方法執(zhí)行前后添加日志記錄、在方法執(zhí)行發(fā)生異常時(shí)處理異常等。
  • 織入(Weaving):將切面應(yīng)用到目標(biāo)對(duì)象并創(chuàng)建新的代理對(duì)象的過程。
  • 目標(biāo)對(duì)象(Target Object):被切面織入的對(duì)象。
  • 引入(Introduction):在不修改目標(biāo)對(duì)象代碼的情況下,為目標(biāo)對(duì)象添加新的方法或?qū)傩浴?/li>
  • AOP代理(AOP Proxy):AOP框架創(chuàng)建的代理對(duì)象,用于實(shí)現(xiàn)AOP功能。

SpringAop實(shí)現(xiàn)(注解的方式)

接口內(nèi)容:

package com.ssmLearn;
/**
 *       + - * / 運(yùn)算的標(biāo)準(zhǔn)接口!
 */
public interface Calculator {
    int add(int i, int j);
    int sub(int i, int j);
    int mul(int i, int j);
    int div(int i, int j);
}

實(shí)現(xiàn)類

package com.ssmLearn;
import org.springframework.stereotype.Component;
/**
 * 實(shí)現(xiàn)計(jì)算接口,單純添加 + - * / 實(shí)現(xiàn)! 摻雜其他功能!
 */
//最后必須放到ioc
@Component
public class CalculatorPureImpl implements Calculator {
    @Override
    public int add(int i, int j) {
        int result = i + j;
        return result;
    }
    @Override
    public int sub(int i, int j) {
        int result = i - j;
        return result;
    }
    @Override
    public int mul(int i, int j) {
        int result = i * j;
        return result;
    }
    @Override
    public int div(int i, int j) {
        int result = i / j;
        return result;
    }
}

需要實(shí)現(xiàn)的內(nèi)容

  • 在加減乘除方法中加入日志輸出
  • 加入異常方法

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

package com.ssmLearn.Aop;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
//使用注解配置插入的代理目標(biāo)
@Aspect
@Component
public class AchiveAop {
    @Before("execution(* com.ssmLearn.CalculatorPureImpl.*(..))")
    public void start(){
        System.out.println("這是初始化方法");
    }
    @After("execution(* com.ssmLearn.CalculatorPureImpl.*(..)))")
    public void end(){
        System.out.println("這是結(jié)束方法");
    }
    @AfterThrowing(value = "execution(public int com.ssmLearn.CalculatorPureImpl.*(..))")
    public void catchExection(){
        System.out.println("出現(xiàn)異常");
    }
}

代碼編寫

  • 注解 Aspect 指示一個(gè)類是一個(gè)切面,告訴aop框架在這個(gè)位置執(zhí)行切入
  • 注解Component用于將這個(gè)類放到ioc容器中
  • 編寫具體方法邏輯,填寫對(duì)應(yīng)的注解內(nèi)容 ,將切面表達(dá)式寫入

配置類

package com.ssmLearn.config;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
@Configuration
@ComponentScan(basePackages = "com.ssmLearn")
//這個(gè)是配置的 aspect代理啟動(dòng)入口
@EnableAspectJAutoProxy
public class javaConfig{
}

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

  • Configuration標(biāo)識(shí)配置類
  • ComponentScan掃描包的注解并將它們注冊(cè)為 Bean。
  • EnableAspectJAutoProxy這個(gè)注解開啟了 AspectJ 的自動(dòng)代理功能。

測(cè)試類的書寫

import com.ssmLearn.Calculator;
import com.ssmLearn.config.javaConfig;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
//@SpringJUnitConfig(locations = "classpath:spring-aop.xml")
@SpringJUnitConfig(value = {javaConfig.class})
class AopTest {
    @Autowired
    private Calculator calculator;
    @Test
    public void testCalculator(){
        int res = calculator.add(1,0);
        System.out.println("res = " + res);
    }
    @Test
    public void test(){
//        使用配置類 就可以直接使用這個(gè)ioc容器 直接使用后AnnotationConfigApplicationContext
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(javaConfig.class);
        Calculator bean = applicationContext.getBean(Calculator.class);
        int res = bean.add(1,2);
        System.out.println("res = " + res);
    }
}

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

  • 使用springJunitConfig框架進(jìn)行測(cè)試,填寫對(duì)應(yīng)的配置類文件,使用Autowired注解實(shí)例化接口。然后使用對(duì)象執(zhí)行相應(yīng)的方法
  • 使用AnnotationConfigApplicationContext根絕配置類創(chuàng)建,然后獲去對(duì)象進(jìn)行調(diào)用

到此這篇關(guān)于springAop講解的文章就介紹到這了,更多相關(guān)springAop講解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringMVC訪問controller報(bào)錯(cuò)404的解決辦法(總結(jié)超詳細(xì))

    SpringMVC訪問controller報(bào)錯(cuò)404的解決辦法(總結(jié)超詳細(xì))

    純注解配置SpringMVC程序,使用tomcat8.5.95版本啟動(dòng),能啟動(dòng)成功并且訪問index.jsp頁面,但是訪問/save時(shí)出現(xiàn)404無法訪問,本文給大家介紹了SpringMVC訪問controller報(bào)錯(cuò)404的解決辦法,文章總結(jié)的非常詳細(xì),需要的朋友可以參考下
    2024-05-05
  • JAVA中的Token 基于Token的身份驗(yàn)證實(shí)例

    JAVA中的Token 基于Token的身份驗(yàn)證實(shí)例

    這篇文章主要介紹了JAVA中的Token 基于Token的身份驗(yàn)證實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Mybatis中的@Select、foreach用法

    Mybatis中的@Select、foreach用法

    這篇文章主要介紹了Mybatis中的@Select、foreach用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Spring?Security用戶定義?

    Spring?Security用戶定義?

    這篇文章主要介紹了Spring?Security用戶定義,大家都知道?Spring?Security的用戶定義有很多方式,其實(shí)主要有兩種,基于內(nèi)存的和基于數(shù)據(jù)庫的,下面我給大家簡(jiǎn)單介紹一下這兩種方式,需要的朋友可以參考下
    2022-02-02
  • IDEA版使用Java操作Redis數(shù)據(jù)庫的方法

    IDEA版使用Java操作Redis數(shù)據(jù)庫的方法

    這篇文章主要介紹了IDEA版使用Java操作Redis數(shù)據(jù)庫的方法,首先需要下載jedis.jar包,然后再工程中設(shè)置具體操作步驟跟隨小編一起學(xué)習(xí)下吧
    2021-08-08
  • java關(guān)于Date日期類型的大小比較

    java關(guān)于Date日期類型的大小比較

    這篇文章主要介紹了java關(guān)于Date日期類型的大小比較,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • IDEA中 Getter、Setter 注解不起作用的問題如何解決

    IDEA中 Getter、Setter 注解不起作用的問題如何解決

    這篇文章主要介紹了IDEA中 Getter、Setter 注解不起作用的問題如何解決,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • java實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能

    java實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡(jiǎn)單計(jì)算器功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • JavaSE一維數(shù)組和二維數(shù)組用法詳解

    JavaSE一維數(shù)組和二維數(shù)組用法詳解

    數(shù)組存儲(chǔ)同一種數(shù)據(jù)類型多個(gè)元素的集合,既可以存儲(chǔ)基本數(shù)據(jù)類型,也可以存儲(chǔ)引用數(shù)據(jù)類型,這篇文章主要給大家介紹了關(guān)于JavaSE一維數(shù)組和二維數(shù)組用法的相關(guān)資料,需要的朋友可以參考下
    2024-04-04
  • ShardingSphere結(jié)合MySQL實(shí)現(xiàn)分庫分表的項(xiàng)目實(shí)踐

    ShardingSphere結(jié)合MySQL實(shí)現(xiàn)分庫分表的項(xiàng)目實(shí)踐

    在實(shí)際開發(fā)中,如果表的數(shù)據(jù)過大我們需要把一張表拆分成多張表,本文主要介紹了使用ShardingSphere實(shí)現(xiàn)MySQL分庫分表,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03

最新評(píng)論