Spring AOP

  • 切面(Aspect):切面用于组织多个Advice,Advice放在切面中定义
  • 连接点(Joinpoint):程序执行过程中明确的店,如方法的调用,或者异常的抛出。在SpringAOP中,连接点总是方法的调用
  • 增强处理(Advice):AOP框架在特定的切入点执行的增强处理。处理有“around”、“before”、“after”等类型
  • 切入点(Ponitcut):可以插入增强处理的连接点。简而言之,当某个连接点满足指定要求时,该连接点将被添加增强处理。该连接点也就变成了切入点
  • 引入:将方法或字段添加到被处理的类中
  • 目标对象:被AOP框架进行增强处理的对象。如果AOP框架采用的是动态代理AOP实现,那么该对象就是一个被代理的对象
  • AOP代理:AOP框架创建的对象,简单地说,代理就是对目标对象的加强
  • 织入:将增强处添加到目标对象中,并创建一个被增强的对象的过程就是织入

业务类  

public class Calculator {
    //业务逻辑方法  做除法 
    public int div(int i,int j){
        System.out.println("-------");
        return i/j;
    }
}

切面类 

@Aspect
public class LogAspects {

    @Pointcut("execution(public int cn.qin.aop.Calculator.*(..))")
    public void pointCut(){}



   // @before 表示在目标方法执行前切入,并指定在哪个方法切入
    @Before("pointCut()")
    public void logStart(JoinPoint joinPoint){
        System.out.println("除法运行....参数列表是:{"+ Arrays.asList(joinPoint.getArgs()) +"}");
    }
    @After("pointCut()")
    public void logEnd(){
        System.out.println("除法结束");
    }
    @AfterReturning(value = "pointCut()",returning ="result")
    public void logReturn(Object result){
        System.out.println("除法正常返回...运行结果是 :{"+result+"}");
    }
    @AfterThrowing(value = "pointCut()",throwing = "exception")
    public void logExcepton(Exception exception){
        System.out.println("运行异常 ...异常信息是:{"+exception+"}");
    }

    @Around("pointCut()")
    public Object Around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
        System.out.println("@around执行目标方法之前..");
        Object obj=proceedingJoinPoint.proceed();
        System.out.println("@around执行目标方法之后..");
        return obj;
    }

}

配置类 

  

 *
 * 日志切面类的方法需要动态感知div()方法运行
 * 通知方法:
 *      前置通知:logStart() 在我们执行div()除法之前运行 (@Before)
 *      后置通知:LogEnd() 在我们执行目标方法div运行结束之后,不管有没有异常 (@After)
 *      返回通知: LogReturn() 在我们的目标方法div正常返回值后(@AfterReturning)
 *      异常通知: LogException() 在我们的目标方法div出现异常后运行(@AfterThrowing)
 *      环绕通知: 动态代理,执行joinPoint.Procced() (其实就是执行我们的目标方法div)执行之前div()相当于前置通知,执行之后相当于后置通知 (@Around)
 *
 *
 */

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

测试 

    @Test
    public void test1(){
        AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(MainConfig.class);
        Calculator c=context.getBean(Calculator.class);
        System.out.println(c.div(3,1));
        context.close();

原文地址:https://www.cnblogs.com/qin1993/p/11752592.html