SpringMvc框架中如何使用Aop面向切面编程

941 阅读2分钟

一、配置文件

1、配置pom.xml配置文件,导入所需要的类

 <dependency>
      <groupId>aopalliance</groupId>
      <artifactId>aopalliance</artifactId>
      <version>1.0</version>
    </dependency>
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.9.1</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>5.0.7.RELEASE</version>
    </dependency> 

2、配置springmvc.xml配置文件

 <!-- 配置组件扫描 -->
 <context:component-scan base-package="Controller,Service,Dao" />
 <!-- 启动AspectJ自动代理 -->
 <aop:aspectj-autoproxy proxy-target-class="true"/> 

二、代码实战演练

1、写一个基础函数

@RestController
public class AopController {
    @RequestMapping(path = "/div")
    public int div(@RequestParam(name = "i") int i, @RequestParam(name = "j") int j){
        return i/j;
    }
} 

2、写一个切面类,包含四种基本功能:前置通知:@Befor,后置通知:@After,返回通知:@AfterReturning,异常通知:@AfterThrowing。注意要用@Aspect注解这个类,告诉Ioc容器这是个切面类。

package Controller;

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

import java.util.Arrays;

@Aspect
//Aspect告诉容器这是一个切面类
@Component
//Component将这个类导入容器
public class AopAspectj {

    //pointcut获取公共的切入点
    @Pointcut(value = "execution(public * Controller.AopController.*(..))")
    public void PointCut(){ }
    
    //@Before 表述在方法前执行
    @Before(value = "PointCut()")
    //JoinPoint一定要出现在参数表的第一位
    public void divStart(JoinPoint joinPoint){
        //获取参数
        Object[] Arg = joinPoint.getArgs();
        System.out.println(""+joinPoint.getSignature().getName()+"除法开始"+ Arrays.asList(Arg) +"");
    }
    //joinPoint.getSignature()获取类的信息

    //@After 表示在方法之后执行
    @After("PointCut()")
    public void divEnd(){
        System.out.println("除法结束");
    }

    //AfterReturning 表示在返回之后执行
    @AfterReturning(value = "PointCut()",returning ="result")
    public void divReturn(Object result){
        System.out.println("除法正常返回结果"+result+"");
    }

    //@AfterThrowing 表示抛出异常
    @AfterThrowing(value = "PointCut()",throwing = "exception")
    public void divException(Exception exception) {
        System.out.println("除法异常"+exception+"");
    }
} 

3、测试,运行项目之后,使用url: http://localhost:8080/div?i=1&&j=1,控制台打印的信息

div除法开始[1, 1]
除法结束
除法正常返回结果1