Spring AOP

原作者:尚硅谷-佟刚


ArithmeticCalculator.java

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

ArithmeticCalculatorImpl.java

package com.atguigu.spring.aop.xml;
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;
    }

}

LoggingAspect.java


package com.atguigu.spring.aop.xml;

import java.util.Arrays;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;

public class LoggingAspect {

    public void beforeMethod(JoinPoint joinPoint){

         String methodName = joinPoint.getSignature().getName();
         Object[] args = joinPoint.getArgs();       

         System.out.println("The method1 " + methodName + " begin with " + Arrays.toString(args));
    }

    public void afterMethod(JoinPoint joinPoint){

        String methodName = joinPoint.getSignature().getName();
        System.out.println("The method1 " + methodName + " ends");

    }

    public void afterReturning(JoinPoint joinPoint, int result){
        String methodName = joinPoint.getSignature().getName();
        System.out.println("The method1 " + methodName + " ends with " + result);

    }

    public void afterThrowing(JoinPoint joinPoint, ArithmeticException e){

        String methodName = joinPoint.getSignature().getName();
        System.out.println("The method1 " + methodName + " occurs execution " + e);
    }

    public Object aroundMethod(ProceedingJoinPoint pjd){
        Object result = null;
        String methodName = pjd.getSignature().getName();

        //执行目标方法
        try {
            //前置通知
            System.out.println("The method " + methodName + " begin with " + Arrays.asList(pjd.getArgs()));
            result = pjd.proceed();
            //返回通知
            System.out.println("The method " + methodName + " ends with " +result);
        } catch (Throwable e) {
            //异常通知
            System.out.println("The method " + methodName + " occurs execution: " + e);
        }
        //后置通知
        System.out.println("The method " + methodName + " ends");
        return result;
    }
}

VlidationAspect .java

package com.atguigu.spring.aop.xml;

import java.util.Arrays;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

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"
    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/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd">
    <!-- 配置bean -->
    <bean id="arithmeticCalculator" 
        class="com.atguigu.spring.aop.xml.ArithmeticCalculatorImpl" />

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

    <!-- 配置 AOP -->
    <aop:config>
        <!-- 配置切点表达式 -->
        <aop:pointcut expression="execution(* com.atguigu.spring.aop.xml.ArithmeticCalculator.*(..))" id="pointcut"/>
        <!-- 配置切面 及通知-->
         <aop:aspect ref="loggingAspect" order="2">

             <aop:before method="beforeMethod" pointcut-ref="pointcut"/>
             <aop:after method="afterMethod" pointcut-ref="pointcut"/>
             <aop:after-throwing method="afterThrowing" pointcut-ref="pointcut" throwing="e"/>
             <aop:after-returning method="afterReturning" pointcut-ref="pointcut" returning="result"/> 

         <!-- <aop:around method="aroundMethod" pointcut-ref="pointcut"/> -->
        </aop:aspect>

        <aop:aspect ref="vlidationAspect" order="1">
             <aop:before method="validateArgs" pointcut-ref="pointcut"/>
        </aop:aspect>

    </aop:config>
</beans>

Main.java

package com.atguigu.spring.aop.xml;

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

public class Main {

    public static void main(String[] args) {

        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext-xml.xml");
        ArithmeticCalculator arithmeticCalculator = (ArithmeticCalculator) ctx.getBean("arithmeticCalculator");

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

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

        result = arithmeticCalculator.div(1000, 0);
        System.out.println("result: " + result);

    }
}

控制台打印:

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值