Spring基于配置文件的方式来配置AOP

一、接口

package com.atguigu.spring.aop.xml;

//接口
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);
}

二、接口的实现类

package com.atguigu.spring.aop.xml;


//实现类
public class ArithmeticCalculatorImpl implements ArithmeticCalculator {
   
     @Override
    public int add(int i, int j) {
        int relust = i+j;
        return relust;
    }

    @Override
    public int sub(int i, int j) {
        int relust = i-j;
        return relust;
    }

    @Override
    public int mul(int i, int j) {
        int relust = i*j;
        return relust;
    }

    @Override
    public int div(int i, int j) {
        int relust = i/j;
        return relust;
    }
}

三、切面一

package com.atguigu.spring.aop.xml;

public class LoggingAspect {

    public void beforeMethod(JoinPoint joinPoint){
        String methodName = joinPoint.getSignature().getName();
        Object[] args = joinPoint.getArgs();

        System.out.println("The method "+methodName+" begins with "+ Arrays.asList(args));
    }

    public void afterMethod(JoinPoint joinPoint){
        String methodName = joinPoint.getSignature().getName();

        System.out.println("The method "+methodName +" end......");
    }



    public void afterReturning(JoinPoint joinPoint,Object result){
        String methodName = joinPoint.getSignature().getName();
        System.out.println("The method "+methodName +" end......result:"+result);
    }


    public void afterThrowing(JoinPoint joinPoint, Exception ex1){
        String methodName = joinPoint.getSignature().getName();
        System.out.println("The method "+methodName +"occurs exception :" +ex1);
    }


    public Object aroundMethod(ProceedingJoinPoint proceedingJoinPoint){

        Object result = null;
        String methodName = proceedingJoinPoint.getSignature().getName();

        try {
            //前置通知
            System.out.println("The method "+methodName+" begins with "+Arrays.asList(proceedingJoinPoint.getArgs()));
            //执行目标方法
            result = proceedingJoinPoint.proceed();

            //返回通知
            System.out.println("The method ends with "+result);
        } catch (Throwable e) {
            //异常通知
            System.out.println("The method occurs exception:"+e);

            throw new RuntimeException(e);
        }

        //后置通知
        System.out.println("The method "+methodName+" ends........");

        return result;
    }
}

四、切面二

package com.atguigu.spring.aop.xml;

public class VlidationAspect {

    public void validateArgs(JoinPoint joinPoint){
        System.out.println("------->validate:" + Arrays.asList(joinPoint.getArgs()));
    }
}

五、配置文件applicationContext-xml.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-3.0.xsd
                            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">

    <!--配置bean-->
    <bean id="arithmeticCalculator" class="com.atguigu.spring.aop.xml.ArithmeticCalculatorImpl">

    </bean>

    <!--配置切面的bean-->
    <bean id="loggingAspect" class="com.atguigu.spring.aop.xml.LoggingAspect">

    </bean>

    <!--配置切面的bean-->
    <bean id="vlidationAspect" class="com.atguigu.spring.aop.xml.VlidationAspect">

    </bean>

    <!--配置AOP-->
    <aop:config>
        <!--配置切点表达式-->
        <aop:pointcut id="pointcut" expression="execution(* com.atguigu.spring.aop.xml.ArithmeticCalculatorImpl.* (..))"/>
        <!--配置切面及通知-->
        <!--切面一-->
        <aop:aspect ref="loggingAspect" order="2">
            <aop:before method="beforeMethod" pointcut-ref="pointcut"></aop:before>
            <aop:after method="afterMethod" pointcut-ref="pointcut"/>
            <aop:after-returning method="afterReturning" pointcut-ref="pointcut" returning="result"/>
            <aop:after-throwing method="afterThrowing" pointcut-ref="pointcut" throwing="ex1"/>
            <!--<aop:around method="aroundMethod" pointcut-ref="pointcut"></aop:around>-->
        </aop:aspect>

        <!--切面二-->
        <aop:aspect ref="vlidationAspect" order="1">
            <aop:before method="validateArgs" pointcut-ref="pointcut"></aop:before>
        </aop:aspect>
    </aop:config>
</beans>

六、测试

package com.atguigu.spring.aop.xml;

public class Test_aop {

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext-xml.xml");

        ArithmeticCalculator arithmeticCalculator = (ArithmeticCalculator) context.getBean("arithmeticCalculator");

        System.out.println(arithmeticCalculator.getClass().getName());

        int result = arithmeticCalculator.add(1,2);
        System.out.println("result:"+result);

        result = arithmeticCalculator.div(200,10);
        System.out.println("result:"+result);

    }
}
原文地址:https://www.cnblogs.com/xjs1874704478/p/12029790.html