Aop

128 阅读2分钟

AOP的使用

aop:面向切面编程(底层就是动态代理)是指程序在运行期间,将某段代码切入到某个位置运行的编程方式

我们还是先看如何使用:

@EnableAspectJAutoProxy
@Configuration
public class MainConfig {
    @Bean
    public Calculator calculator() {
        return new Calculator();
    }

    @Bean
    public LogAspects logAspects() {
        return new LogAspects();
    }

}

在POM.XML中导入spring-aspects依赖包

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>5.0.6.RELEASE</version>
</dependency>

新建立一个业务逻辑类Calculator.java

public class Calculator {

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

新建一个日志切面类.

@Aspect
public class LogAspects {
    @Pointcut(value = " execution(public int com.enjoy.cap10.aop.Calculator.*(..))")
    public void pointCut() {
    }

    ;

    @Before("pointCut()")
    public void logStart(JoinPoint joinPoint) {
        System.out.println(joinPoint.getSignature().getName() + "除法运行....参数列表是:{" + Arrays.asList(joinPoint.getArgs()) + "}");
    }

    @After("pointCut()")
    public void logEnd(JoinPoint joinPoint) {
        System.out.println(joinPoint.getSignature().getName() + "除法结束......");

    }

    @AfterReturning(value = "pointCut()", returning = "result")
    public void logReturn(Object result) {
        System.out.println("除法正常返回......运行结果是:{" + result + "}");
    }

    @AfterThrowing(value = "pointCut()", throwing = "exception")
    public void logException(Exception exception) {
        System.out.println("运行异常......异常信息是:{" + exception + "}");
    }

    @Around("pointCut()")
    public Object Around(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("@Arount:执行目标方法之前...");
        Object obj = joinPoint.proceed();//相当于开始调div地
        System.out.println("@Arount:执行目标方法之后...");
        return obj;
    }

}

日志切面类的方法需要动态感知到div()方法运行到哪里了, 然后再执行, 如果除法开始, 就日志开始方法, 也叫通知方法, 分以下几种:

  • 前置通知: logStart(),在目标方法(div)运行之前运行 (@Before)

  • 后置通知:logEnd(), 在目标方法(div)运行结束之后运行,无论正常或异常结束 (@After)

  • 返回通知:logReturn, 在目标方法(div)正常返回之后运行 (@AfterReturning)

  • 异常通知:logException, 在目标方法(div)出现异常后运行(@AfterThrowing)

  • 环绕通知:以上没写,动态代理, 手动执行目标方法运行joinPoint.procced(),最底层通知,手动指定执行目标方法(@Around), 执行之前相当于前置通知, 执行之后相当于返回通知

其实就是通过反射执行目标对象的连接点处的方法;

源码分析

实在懒得打字了,把额哦整理的xmind贴出来的吧

AOP