中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解spring AOP 框架

發布時間:2021-11-25 22:45:13 來源:億速云 閱讀:144 作者:柒染 欄目:開發技術

如何理解spring AOP 框架,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

spring AOP (包含基于注解和配置文件兩種方式)

spring AOP?面向切面編程,區別于面向對象編程OOP

AspectJ: 是Java社區里面最完整最流行的AOP框架,下面就用aspectJ來上例子

 一.基于注解方式

步驟如下:

  1. 引入jar包(spring的必要jar包 以及aspectj的jar包)

  2. 業務方法HelloworldService (類上加上注解@Component,放入到spring ioc容器中)

  3. 切面LogingAop (類上加上注解@Component使其加入到ioc容器中,還需要注解@Aspect,使其成為一個切面)

  4. spring配置文件applicationContext.xml (掃描包,以及aop生成代理類的配置<aop:aspectj-autoproxy/>)

  5. 測試

結構如下:

如何理解spring AOP 框架

HelloworldService代碼實現:

如何理解spring AOP 框架

package com.aop.demo;import org.springframework.stereotype.Component;

@Componentpublic class HelloworldService {    public int add(int i, int j){        return i+j;
    }
}

如何理解spring AOP 框架

LogingAop代碼實現:

如何理解spring AOP 框架

package com.aop.demo;import java.util.Arrays;import java.util.List;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.annotation.Pointcut;import org.springframework.stereotype.Component;

@Component
@Aspectpublic class LogingAop {

    @Pointcut("execution(public int com.aop.demo.HelloworldService.add (int,int))")    public void pointcut(){};
    
    @Before(value="pointcut()")    public void beforeMethod(JoinPoint jointPoint){
        String methodName = jointPoint.getSignature().getName();
        List args = Arrays.asList(jointPoint.getArgs());
        System.out.println("Method("+methodName+") args("+args+") Start");
    }
}

如何理解spring AOP 框架

applicationContext.xml中配置

如何理解spring AOP 框架

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd"><context:component-scan base-package="com.aop.demo"></context:component-scan><aop:aspectj-autoproxy/></beans>

如何理解spring AOP 框架

測試代碼如下

如何理解spring AOP 框架

package com.aop.demo;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class AopTest {

    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        HelloworldService helloworldService = (HelloworldService) ctx.getBean("helloworldService");
        int result = helloworldService.add(1, 2);
        System.out.println("Result is "+result);
    }
}

如何理解spring AOP 框架

測試結果如下:

Method(add) args([1, 2]) Start
Result is 3

 AOP中的概念介紹:

切面:跨越應用程序多個模塊的功能,比如打日志,比如參數驗證,類似這種被模塊化的特殊對象
通知: 上面切面中的方法
切入點:相當于查詢條件,在哪些業務方法中需要加入通知,spring自動生成新的代理對象

 AspectJ支持5中類型的通知注解:

@Before: 前置通知,在方法執行之前執行
@After: 后置通知,在方法執行之后執行 (不管是否有異常,都會執行)
@AfterRuning: 返回通知,在方法返回結果之后執行 (只在沒有異常時候才執行)
@AfterThrowing: 異常通知,在方法拋出異常之后
@Around: 環繞通知,圍繞著方法執行

AspectJ的5中注解的代碼示例

如何理解spring AOP 框架

package com.aop.demo;import java.util.Arrays;import java.util.List;import org.aspectj.lang.JoinPoint;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.After;import org.aspectj.lang.annotation.AfterReturning;import org.aspectj.lang.annotation.AfterThrowing;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Before;import org.aspectj.lang.annotation.Pointcut;import org.springframework.stereotype.Component;

@Component
@Aspectpublic class LogingAop {

    @Pointcut("execution(public int com.aop.demo.HelloworldService.add (int,int))")    public void pointcut(){};
    
    @Before(value="pointcut()")    public void beforeMethod(JoinPoint jointPoint){
        String methodName = jointPoint.getSignature().getName();
        List args = Arrays.asList(jointPoint.getArgs());
        System.out.println("Method("+methodName+") args("+args+") Start");
    }
    
    @After(value="pointcut()")    public void afterMethod(JoinPoint jointPoint){
        String methodName = jointPoint.getSignature().getName();
        List args = Arrays.asList(jointPoint.getArgs());
        System.out.println("Method("+methodName+") args("+args+") After");
    }
    
    @AfterReturning(value="pointcut()",returning="result")    public void afterReturingMethod(JoinPoint jointPoint,Object result){
        String methodName = jointPoint.getSignature().getName();
        List args = Arrays.asList(jointPoint.getArgs());
        System.out.println("Method("+methodName+") args("+args+") After Runing + Result:"+result);
    }
    
    @AfterThrowing(value="pointcut()",throwing="e")    public void afterThrowingMethod(JoinPoint jointPoint,Exception e){
        String methodName = jointPoint.getSignature().getName();
        List args = Arrays.asList(jointPoint.getArgs());
        System.out.println("Method("+methodName+") args("+args+") After Throw Exception:" +e);
    }
    
    @Around(value="pointcut()")    public Object aroundMethod(ProceedingJoinPoint jointPoint){
        
        Object result = null;
        String methodName = jointPoint.getSignature().getName();        try {
            System.out.println(methodName+"前置通知.....");
            result = jointPoint.proceed();
            System.out.println("后置通知.....");
        } catch (Throwable e) {
            System.out.println("異常通知.....");            throw new RuntimeException();
        }
        System.out.println("返回通知.....");        return result;
    }
}

如何理解spring AOP 框架

注意:@Around環繞通知,必須攜帶對象ProceedingJoinPoint參數

環繞通知類似于動態代理的全部過程,可以決定是否執行目標方法

 切面的優先級

可以在切面上注解@Order,其中值越小,切面的優先級越高

如何理解spring AOP 框架

 二.基于配置文件方式

步驟如下:

  1. 將上面的三個類移到其他包里面,去掉類以及方法中的所有注解

  2. 定義新的配置文件applicationContext-xml.xml

結構如下:

如何理解spring AOP 框架

applicationContext-xml.xml的配置

如何理解spring AOP 框架

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">

    <!-- 配置業務bean -->
    <bean id="helloworldService" class="com.aop.demo.xml.HelloworldService"></bean>

    <!-- 配置切面 -->
    <bean id="logingAop" class="com.aop.demo.xml.LogingAop"></bean>

    <!-- 配置AOP -->
    <aop:config>
        <aop:pointcut            expression="execution(public int com.aop.demo.xml.HelloworldService.add (int,int))" id="pointCut" />
        <aop:aspect ref="logingAop">
            <aop:before method="beforeMethod" pointcut-ref="pointCut" />
        </aop:aspect>
    </aop:config></beans>

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

上栗县| 晋中市| 宜州市| 菏泽市| 桦川县| 唐海县| 毕节市| 武义县| 苗栗县| 保康县| 卓资县| 英德市| 恩施市| 靖宇县| 东方市| 顺昌县| 鄄城县| 辰溪县| 吴堡县| 六盘水市| 静海县| 集安市| 福海县| 凉城县| 闻喜县| 运城市| 麦盖提县| 尖扎县| 松滋市| 法库县| 西和县| 辰溪县| 客服| 南溪县| 托克托县| 全州县| 苏尼特右旗| 岚皋县| 岢岚县| 资溪县| 宜宾县|