java Spring 基于xml配置方式的AOP

我们具体用代码来说明:
了解springcloud架构可以加求求:三五三六二四七二五九
1、ArithmeticCalculator.java

package com.proc;

public interface ArithmeticCalculator {
    int add(int i, int j);
    int sub(int i, int j);
    
    int mul(int i, int j);
    int div(int i, int j);
}

2、ArithmeticCalculatorImpl.java 实现接口ArithmeticCalculator

package com.proc;

public class ArithmeticCalculatorImpl implements ArithmeticCalculator{
    public int add(int i, int j) {
        int result = i + j;
        return result;
    }

    public int sub(int i, int j) {
        int result = i - j;
        return result;
    }

    public int mul(int i, int j) {
        int result = i * j;
        return result;
    }

    public int div(int i, int j) {
        int result = i / j;
        return result;
    }
}

3、LoggingAspect.java 日志切面

package com.proc;

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;


public class LoggingAspect {

    public void beforeMethod(JoinPoint point){
        System.out.println("正在执行方法: "+point.getSignature().getName());
    }
    

    public void afterMethod(JoinPoint point){
        System.out.println("方法执行结束: "+point.getSignature().getName());
    }
    

    public void afterReturningMethod(JoinPoint point,Object retVal){
        System.out.println("方法: "+point.getSignature().getName()+"执行结果为:"+retVal);
    }
    

    public void afterThrowingMethod(JoinPoint point,Exception ex){
        System.out.println("执行方法: "+point.getSignature().getName()+"出现了异常:"+ex.getMessage());
    }

    public Object aroundMethod(ProceedingJoinPoint point){
        
        System.out.println("环绕通知: "+point.getSignature().getName());
        Object result=null;
        //这里相当于前置通知
        try {
            //执行方法
            result= point.proceed();
            //这里相当于结果通知
        } catch (Throwable e) {
            //这里相当于异常通知
            e.printStackTrace();
            
        }
        //这里相当于后置通知
        System.out.println("环绕通知: "+point.getSignature().getName());
        return result;
    }
}

其实这也就是一个普通类,里面定义了写方法

4、ValidateAspect.java 验证切面

package com.proc;

import org.aspectj.lang.JoinPoint;

public class ValidateAspect {
    public void beforeMethod(JoinPoint point){
        System.out.println("验证前置通知: "+point.getSignature().getName());
    }
}

5、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/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="arithmeticCalculator" class="com.proc.ArithmeticCalculatorImpl"/>
    <bean id="loggingAspect" class="com.proc.LoggingAspect" />
    <bean id="validateAspect" class="com.proc.ValidateAspect"/>
    
    <aop:config>
        <!-- 配置切面表达式 -->
        <aop:pointcut expression="execution(* *..*(..))" id="pointcut"/>
        
        <!-- 配置切面及通知 -->
        <aop:aspect ref="loggingAspect" order="1">
            <aop:before method="beforeMethod" pointcut-ref="pointcut"/>
            <aop:after method="afterMethod" pointcut-ref="pointcut"/>
            <aop:after-returning method="afterReturningMethod" pointcut-ref="pointcut"  returning="retVal"/>
            <aop:after-throwing method="afterThrowingMethod" pointcut-ref="pointcut" throwing="ex"/>
            <aop:around method="aroundMethod" pointcut-ref="pointcut" />
        </aop:aspect>
        
        <aop:aspect ref="validateAspect" order="2">
            <aop:before method="beforeMethod" pointcut-ref="pointcut"/>
        </aop:aspect>
    </aop:config>
</beans>

测试代码:

 ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
2 ArithmeticCalculator calc=(ArithmeticCalculator) ctx.getBean("arithmeticCalculator");
3 System.out.println(calc.add(3, 5));
4 System.out.println(calc.sub(3, 5)); 
5 System.out.println(calc.mul(6, 2)); 
6 System.out.println(calc.div(6, 2)); 

输出结果:

正在执行方法: add
环绕通知: add
验证前置通知: add
环绕通知: add
方法: add执行结果为:8
方法执行结束: add
8
正在执行方法: sub
环绕通知: sub
验证前置通知: sub
环绕通知: sub
方法: sub执行结果为:-2
方法执行结束: sub
-2
正在执行方法: mul
环绕通知: mul
验证前置通知: mul
环绕通知: mul
方法: mul执行结果为:12
方法执行结束: mul
12
正在执行方法: div
环绕通知: div
验证前置通知: div
环绕通知: div
方法: div执行结果为:3
方法执行结束: div
3

发布了93 篇原创文章 · 获赞 93 · 访问量 4282

猜你喜欢

转载自blog.csdn.net/weixin_45821812/article/details/104521869