yangyang12138

导航

spring-aop

1.概述

  spring-aop是一个面向切面的中间件,是对oop的完善和补充。

2.基本概念

      (1)Aspect(切面):通常是一个类,里面可以定义切入点和通知
      (2)JointPoint(连接点):程序执行过程中明确的点,一般是方法的调用
      (3)Advice(通知):AOP在特定的切入点上执行的增强处理,有before,after,afterReturning,afterThrowing,around
      (4)Pointcut(切入点):就是带有通知的连接点,在程序中主要体现为书写切入点表达式
      (5)AOP代理:AOP框架创建的对象,代理就是目标对象的加强。Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类

首先config通过将配置转化为BeanDefinetion,BeanDefinetion可以直接产生bean,bean主要是切面和目标

然后切面被封装成Advisor,切面的元素就是Advice,方法本身被封装成interceptor,interceptor本书就是一种advice且可执行。外部定义的interceptor可以通过适配器定义为advisor,

最后代理工厂将Advisor和TargetSource封装成最终的代理。pointcut用于匹配可执行的点,它包含了methodMatcher和classFilter的实现。Advisor之中就包含了pointcut属性,用于判断一个方法是否应该执行该advisor的advice。

也就是配置产生了多个advisor,advisor通过pointcut的匹配产生了advice,advice用于构造了代理,代理通过运行advice来完成整个aop的流程。

 

 
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
 
//日志切面类
@Aspect
public class LogAspects {
    @Pointcut("execution(public int Demo.*(..))")
    public void pointCut(){};

    @Before("pointCut()")
    public void logBefore(){
        System.out.println("before");
    }
    @After("pointCut()")
    public void logAfter(){
        System.out.println("after");
    }
    @AfterReturning("pointCut()")
    public void logReturn(){
        System.out.println("return");
    }
    @AfterThrowing("pointCut()")
    public void logException(){
        System.out.println("error");
    }
    @Around("pointCut()")
    public Object Around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{
        System.out.println("before");
        Object obj = proceedingJoinPoint.proceed();
        System.out.println("after");
        return obj;
    }
}

@Configuration
@EnableAspectJAutoProxy
public class Demo {
@Bean
public Demo demo(){
return new Demo();
}

}

 

 

posted on 2020-07-10 01:51  杨杨09265  阅读(199)  评论(0编辑  收藏  举报