2分钟学会springAop相关注解的使用

Posted 一个懒惰的程序员

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2分钟学会springAop相关注解的使用相关的知识,希望对你有一定的参考价值。

前面我们花了大量的篇幅去写了springIoc相关注解的使用演示以及部分的实现原理,没有查看的同学可以


那今天我们就来看一下spring的另一大特性AOP怎么通过注解来实现,涉及到的注解有如下:

  • @EnableAspectJAutoProxy - 开启切面功能注解

  • @Aspect - 声明为切面类注解

  • @Pointcut - 切面的切入点

  • @Before - 前置通知

  • @After - 后置通知

  • @AfterReturning - 切面返回通知

  • @AfterThrowing - 异常通知

  • @Around - 环绕通知


下面我们就来演示一下上面提到的这些注解


首先要使用spring的aop功能需要spring-aspects的jar包,如下:


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


新建一个计算器类MathCalculator里边只有一个除法方法如下:


/**
* 定义一个计算器类
*
* @author zhangqh
* @date 2018年5月23日
*/

public class MathCalculator {
   /**
    * 除法
    * @param i
    * @param j
    * @return
    */

   public int division(int i,int j){
       System.out.println("开始执行除法【 division 】了..........");
       return i/j;
   }
}


新建一个切面类LogAspects如下:


/**
* 切面类
* @Aspect: 告诉Spring当前类是一个切面类
* @author zhangqh
* @date 2018年5月23日
*/

@Aspect
public class LogAspects {
   //抽取公共的切入点表达式
   @Pointcut("execution(public int com.zhang.aop.MathCalculator.*(..))")
   public void pointCut(){};
   //@Before在目标方法之前切入;切入点表达式(指定在哪个方法切入)
   @Before("pointCut()")
   public void logStart(JoinPoint joinPoint){
       Object[] args = joinPoint.getArgs();
       System.out.println("@Before前置通知,执行方法为==="+joinPoint.getSignature().getName()+",参数列表是:{"+Arrays.asList(args)+"}");
   }
   @After("pointCut()")
   public void logEnd(JoinPoint joinPoint){
       System.out.println("@After后置通知,执行方法为==="+joinPoint.getSignature().getName());
   }
   //JoinPoint参数一定要作为第一个参数 不然会报错
   @AfterReturning(value="pointCut()",returning="result")
   public void logReturn(JoinPoint joinPoint,Object result){
       System.out.println("@AfterReturning返回通知,执行方法为==="+joinPoint.getSignature().getName()+",返回结果为:{"+result+"}");
   }
   @AfterThrowing(value="pointCut()",throwing="exception")
   public void logException(JoinPoint joinPoint,Exception exception){
       System.out.println("@AfterThrowing异常通知,执行方法为==="+joinPoint.getSignature().getName()+",异常信息:{"+exception+"}");
   }
}


新建一个配置类如下:


/**
* 定义一个AOP配置类
* @EnableAspectJAutoProxy 开启切面功能
* @author zhangqh
* @date 2018年5月23日
*/

@EnableAspectJAutoProxy
@Configuration
public class MainConfigOfAOP {
   // 业务逻辑类加入容器中
   @Bean
   public MathCalculator calculator() {
       return new MathCalculator();
   }
   // 切面类加入到容器中
   @Bean
   public LogAspects logAspects() {
       return new LogAspects();
   }
}


编写测试类如下:


  
    
    
  
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfAOP.class);
MathCalculator mathCalculator = applicationContext.getBean(MathCalculator.class);
mathCalculator.division(6, 2);
// 把除数改为0 看运行结果
//mathCalculator.division(6, 0);        
applicationContext.close();


运行如下:


@Before前置通知,执行方法为===division,参数列表是:{[6, 2]}
开始执行除法【 division 】了..........
@After后置通知,执行方法为===division
@AfterReturning返回通知,执行方法为===division,返回结果为:{3}


好了以上简单的演示了下基于spring注解实现AOP,后边的文章会详细的讲解其中的实现原理以及平时使用的时候一些需要注意的点,敬请期待.....


以上是今天文章的所有内容,欢迎大家吐槽






以上是关于2分钟学会springAop相关注解的使用的主要内容,如果未能解决你的问题,请参考以下文章

springAop 使用@Around,@After等注解时,代码运行两边的问题

10分钟学会JAVA注解(annotation)

SpringAOP+自定义注解实现日志记录

SpringAOP+自定义注解实现日志记录

使用Spring的注解方式实现AOP入门

SpringAOP 使用注解的简单使用