aop注解配置切点 spring_Spring注解驱动开发之十二——Spring 中AOP介绍以及测试

555e1980db55006ad1bf16fe3b840dd0.png

本文包含以下内容:

  1. 什么是AOP

  2. 引入AOP依赖、创建测试类

  3. 建立配置类,并交由Spring管理

  4. 通过Spring 管理AOP 测试

1.什么是AOP

AOP为Aspect Oriented Programming的缩写,是 面向切面编程。在应用层面可以理解为:在某个指定的方法执行的前,执行后,执行异常时等不同状态时,运行指定的方法。指在程序运行期间 动态的将某段代码切入到 指定方法指定位置进行运行的编程方式。其中可以使用Spring 封装好的 AOP 注解进行标记对应的切面函数,达到实现面向切面编程思维的作用。

Spring封装的通知方法如下:

前置通知( @Before):logStart:在目标方法(div)运行之前运行 后置通知( @After):logEnd:在目标方法(div)运行结束之后运行(无论方法正常结束还是异常结束) 返回通知( @AfterReturning):logReturn:在目标方法(div)正常返回之后运行 异常通知( @AfterThrowing):logException:在目标方法(div)出现异常以后运行 环绕通知(@Around):动态代理,手动推进目标方法运行(joinPoint.procced())下面开始编码测试:

2.引入AOP依赖、创建测试类

1)引入spring-aspects 依赖
<dependency>  <groupId>org.springframeworkgroupId>  <artifactId>spring-aspectsartifactId>  <version>4.3.12.RELEASEversion>dependency>
2)建立目标函数,即切面函数
public class MathCalculator {    public int div(int i,int j){    System.out.println("MathCalculator...div...");    return i/j;    }}
3)建立动态切入的函数:可以通过 @P oint cut 注解抽象出 切入点避免重复代码的编写。 可以同类下可以直接引用切点方法,可以填写切点的 切入点表达式 JoinPoint作为参数时,必须放在 第一位,否则 报错

@Before("pointCut()") 标记运行开始前

@After("com.atguigu.aop.LogAspects.pointCut()") 标记运行介绍后

@AfterReturning(value="pointCut()",returning="result") 可以通过returning将返回值返回

@AfterThrowing(value="pointCut()",throwing="exception") 通过exception将异常排除
@Aspectpublic class LogAspects {    //抽取公共的切入点表达式  //1、本类引用  //2、其他的切面引用  @Pointcut("execution(public int com.atguigu.aop.MathCalculator.*(..))")  public void pointCut(){};    //@Before在目标方法之前切入;切入点表达式(指定在哪个方法切入)  @Before("pointCut()")  public void logStart(JoinPoint joinPoint){    Object[] args = joinPoint.getArgs();    System.out.println(""+joinPoint.getSignature().getName()+"运行。。。@Before:参数列表是:{"+Arrays.asList(args)+"}");  }    @After("com.atguigu.aop.LogAspects.pointCut()")  public void logEnd(JoinPoint joinPoint){    System.out.println(""+joinPoint.getSignature().getName()+"结束。。。@After");  }    //JoinPoint一定要出现在参数表的第一位  @AfterReturning(value="pointCut()",returning="result")  public void logReturn(JoinPoint joinPoint,Object result){    System.out.println(""+joinPoint.getSignature().getName()+"正常返回。。。@AfterReturning:运行结果:{"+result+"}");  }    @AfterThrowing(value="pointCut()",throwing="exception")  public void logException(JoinPoint joinPoint,Exception exception){    System.out.println(""+joinPoint.getSignature().getName()+"异常。。。异常信息:{"+exception+"}");  }}

3.建立配置类,并交由Spring管理

1)将切面类和切面方法,加入到容器中,并且添加 @EnableAspectJAutoProxy 注解启用基于注解的面向切面模式
@EnableAspectJAutoProxy@Configurationpublic class MainConfigOfAOP {     //业务逻辑类加入容器中  @Bean  public MathCalculator calculator(){    return new MathCalculator();  }  //切面类加入到容器中  @Bean  public LogAspects logAspects(){    return new LogAspects();  }}
2)在切面类上加上 @Aspect 注解 向Spring表名这是一个切面类
@Aspectpublic class LogAspects 

4.通过Spring 管理AOP 测试

1.单独建立,类的实例化对象,运行方法
@Test  public void test01(){    AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfAOP.class);        //1、不要自己创建对象    MathCalculator mathCalculator = new MathCalculator();    mathCalculator.div(1, 1);  }
得到结果:没有通过Spring 容器,将 不会运行对应的切面函数

417fdf2426f90fb365ab53072d925030.png

2)通过容器获得实例化对象:
  @Test  public void test01(){    AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfAOP.class);    MathCalculator mathCalculator = applicationContext.getBean(MathCalculator.class);    mathCalculator.div(1, 0);    applicationContext.close();  }
得到结果:运行前执行Before 函数、运行结束运行After ,正常返回运行@AfterReturning 方法。

bd98cefab03a50646fd56d2c5245c90d.png

结果二:运行发生异常,运行异常方法

55b3c955c1b70744d7e7e8951e5871df.png

-END-

4db4a5629b2d1a912488c847eefc000e.png

可以关注我的公众号,免费获取价值1980元学习资料

点击“在看”,学多少都不会忘~

c34d450adecc471f0a54a10af5578c3f.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值