基于注解的AOP开发

快速入门

开发步骤

  1. 创建目标接口和目标类(内部有切点)
  2. 创建切面类(内部有增强方法)
  3. 将目标类和切面类的对象创建权交给Spring
  4. 在切面类中注释配置织入关系
  5. 配置文件中开启扫描和AOP的自动代理
  6. 测试

目标类

package zcf.anno;

import org.springframework.stereotype.Component;

@Component("target")
public class Target implements TargetInterface {
    @Override
    public void save() {
        System.out.println("save running ... ");
    }
}

切面类

package zcf.anno;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Component("myAspact")
@Aspect//标注当前MyAspact是一个切面类
public class MyAspact {

//    配置前置通知
    @Before("execution( * zcf.anno.*.*(..))")
    public void before(){
        System.out.println("前置增强。。。。。");
    }

    public void afterRuning(){
        System.out.println("后置增强。。。。。");
    }


//  ProceedingJoinPoint:正在执行的连接点====切点
    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("环绕前增强。。。。。");
        Object proceed = proceedingJoinPoint.proceed();//切入点方法
        System.out.println("环绕后增强。。。。。");
        return proceed;
    }

    public void aroundThrowing()  {
        System.out.println("异常增强。。。。。");
    }

    public void after()  {
        System.out.println("最终增强。。。。。");
    }
}

applicationContext.xml配置文件配置

<!--组件扫描-->
    <context:component-scan base-package="zcf"></context:component-scan>
<!--    aop自动代理-->
    <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

注解配置AOP详情

注解通知类型

  • 通知的配置语法:@通知注释(“起点表达式”)
名称注解说明
前置通知@Before用于配置前置通知。指定增强的方法在切入点方法之前执行
后置通知@AfterRetuning用于配置后置通知。指定增强的方法在切入点方法之后执行
环绕通知@Around用于配置环绕通知。指定增强的方法在切入点方法之前和切入点之后执行
异常抛出通知@AfterThrowing用于配置异常抛出通知。指定增强的方法在出现异常执行
最终通知@after用于配置最终通知。无论增强方式执行是否有异常都会执行

切点表达式的抽取

在切面内定义方法,在该方法上使用@Pointcut注释定义切点表达式,然后再在增强注释中进行引用

切面类

package zcf.anno;

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

@Component("myAspact")
@Aspect//标注当前MyAspact是一个切面类
public class MyAspact {

//    配置前置通知
    @Before("execution( * zcf.anno.*.*(..))")
    public void before(){
        System.out.println("前置增强。。。。。");
    }

    @AfterReturning("execution( * zcf.anno.*.*(..))")
    public void afterRuning(){
        System.out.println("后置增强。。。。。");
    }


    @Around("execution( * zcf.anno.*.*(..))")
//  ProceedingJoinPoint:正在执行的连接点====切点
    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        System.out.println("环绕前增强。。。。。");
        Object proceed = proceedingJoinPoint.proceed();//切入点方法
        System.out.println("环绕后增强。。。。。");
        return proceed;
    }

    @AfterThrowing("MyAspact.pointcut()")
    public void aroundThrowing()  {
        System.out.println("异常增强。。。。。");
    }

    @After("pointcut()")
    public void after()  {
        System.out.println("最终增强。。。。。");
    }

//    定义切点表达式
    @Pointcut("execution( * zcf.anno.*.*(..))")
    public void pointcut(){}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值