1. 程式人生 > 其它 >XML配置AOP

XML配置AOP

需結合上篇的AOP五種通知方式

LogAspectXml.java

package org.javaboy.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

public class LogAspectXml {
    public void before(JoinPoint joinPoint){
        String name = joinPoint.getSignature().getName();
        System.out.println(name+"方法開始執行了~");
    }

    /**
     * 後置通知,在目標方法執行之後執行
     * @param joinPoint
     */
    public void after(JoinPoint joinPoint){
        String name = joinPoint.getSignature().getName();
        System.out.println(name+"方法執行結束了...a");
    }

    /**
     * 返回通知,可以在該方法中獲取目標方法的返回值,如果目標方法的返回值為void,則收到null
     * @param joinPoint
     * @param r 返回的引數名稱 和這裡方法的引數名一一對應
     */
    public void returning(JoinPoint joinPoint,Integer r){
        String name = joinPoint.getSignature().getName();
        System.out.println(name+"方法返回通知:"+r);
    }

    /**
     * 異常通知,當目標方法丟擲異常時,該方法會觸發
     * @param joinPoint
     * @param e 異常引數,和方法的引數名一一對應,注意異常的型別
     */
    public void afterThrowing(JoinPoint joinPoint,Exception e){
        String name = joinPoint.getSignature().getName();
        System.out.println(name+"方法異常通知:"+e.getMessage());
    }

    /**
     * 環繞通知,環繞通知是上面四種方法的集大成者,環繞通知的核心類似於在反射中執行方法
     * @param pjp
     * @return
     */
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        //這個方法有點類似於method.invoke 方法,我們可以在這個方法的前後分別新增日誌,相當於前置/後置通知
        Object proceed = pjp.proceed(new Object[]{5,5});
        return proceed;
    }
}

resources下的applicationContext.xml

<?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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">

    <bean class="org.javaboy.aop.LogAspectXml" name="logAspect"/>
    <bean class="org.javaboy.aop.service.MyCalculatorImpl" id="myCalculator"/>
    <aop:config>
        <aop:pointcut id="pointcut" expression="execution(* org.javaboy.aop.service.*.*(..))"/>
        <aop:aspect ref="logAspect">
            <aop:before method="before" pointcut-ref="pointcut"/>
            <aop:after method="after" pointcut-ref="pointcut"/>
            <aop:after-returning method="returning" pointcut-ref="pointcut" returning="r"/>
            <aop:after-throwing method="afterThrowing" pointcut-ref="pointcut" throwing="e"/>
            <aop:around method="around" pointcut-ref="pointcut"/>

        </aop:aspect>
    </aop:config>
</beans>

MainXml.java

package org.javaboy.aop;

import org.javaboy.aop.service.MyCalculator;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author 鄧雪松 (づ ̄ 3 ̄)づ)
 * @create 2021-10-28-20-14
 */
public class MainXml {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        MyCalculator calculator = ctx.getBean(MyCalculator.class);
        calculator.add(6,7);
        calculator.min(6,7);
    }
}

完 ~