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);
    }
}

完 ~

posted @ 2021-10-29 16:42  ╰(‵□′)╯  阅读(23)  评论(0编辑  收藏  举报