美文网首页BATJ架构
spring aop基本概念

spring aop基本概念

作者: 裘马轻狂大帅 | 来源:发表于2020-07-06 07:42 被阅读0次

    7Spring框架自诞生之日就拯救我等程序员于水火之中,它有两大法宝,一个是IoC控制反转,另一个便是AOP面向切面编程。今日我们就来破一下它的AOP法宝,以便以后也能自由使出一手AOP大法。

     AOP全名Aspect-oriented programming面向切面编程大法,它有很多兄弟,分别是经常见的面向对象编程,朴素的面向过程编程和神秘的函数式编程等。所谓AOP的具体解释,以及和OOP的区别不清楚的同学可以自行去了解。

     AOP实现的关键在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理。本文就主要讲解AOP的基本术语,然后用一个例子让大家彻底搞懂这些名词,最后介绍一下AOP的两种代理方式:

    以AspectJ为代表的静态代理。

    以Spring AOP为代表的动态代理。

    基本术语

    (1)切面(Aspect)

     切面是一个横切关注点的模块化,一个切面能够包含同一个类型的不同增强方法,比如说事务处理和日志处理可以理解为两个切面。切面由切入点和通知组成,它既包含了横切逻辑的定义,也包括了切入点的定义。 Spring AOP就是负责实施切面的框架,它将切面所定义的横切逻辑织入到切面所指定的连接点中。

    @Component

    @Aspect

    public class LogAspect {

    }

     可以简单地认为, 使用 @Aspect 注解的类就是切面

    (2) 目标对象(Target)

     目标对象指将要被增强的对象,即包含主业务逻辑的类对象。或者说是被一个或者多个切面所通知的对象。

    (3) 连接点(JoinPoint)

     程序执行过程中明确的点,如方法的调用或特定的异常被抛出。连接点由两个信息确定:

    方法(表示程序执行点,即在哪个目标方法)

    相对点(表示方位,即目标方法的什么位置,比如调用前,后等)

     简单来说,连接点就是被拦截到的程序执行点,因为Spring只支持方法类型的连接点,所以在Spring中连接点就是被拦截到的方法。

    @Before("pointcut()")

    public void log(JoinPoint joinPoint) { //这个JoinPoint参数就是连接点

    }

    4) 切入点(PointCut)

    切入点是对连接点进行拦截的条件定义。切入点表达式如何和连接点匹配是AOP的核心,Spring缺省使用AspectJ切入点语法。

    一般认为,所有的方法都可以认为是连接点,但是我们并不希望在所有的方法上都添加通知,而切入点的作用就是提供一组规则(使用 AspectJ pointcut expression language 来描述) 来匹配连接点,给满足规则的连接点添加通知。

    @Pointcut("execution(* com.remcarpediem.test.aop.service..*(..))")

    public void pointcut() {

    }

    上边切入点的匹配规则是com.remcarpediem.test.aop.service包下的所有类的所有函数。

    (5) 通知(Advice)

    通知是指拦截到连接点之后要执行的代码,包括了“around”、“before”和“after”等不同类型的通知。Spring AOP框架以拦截器来实现通知模型,并维护一个以连接点为中心的拦截器链。

    // @Before说明这是一个前置通知,log函数中是要前置执行的代码,JoinPoint是连接点,

    @Before("pointcut()")

    public void log(JoinPoint joinPoint) {

    }

    (6) 织入(Weaving)

    织入是将切面和业务逻辑对象连接起来, 并创建通知代理的过程。织入可以在编译时,类加载时和运行时完成。在编译时进行织入就是静态代理,而在运行时进行织入则是动态代理。

    (7) 增强器(Adviser)

    Advisor是切面的另外一种实现,能够将通知以更为复杂的方式织入到目标对象中,是将通知包装为更复杂切面的装配器。Advisor由切入点和Advice组成。

    Advisor这个概念来自于Spring对AOP的支撑,在AspectJ中是没有等价的概念的。Advisor就像是一个小的自包含的切面,这个切面只有一个通知。切面自身通过一个Bean表示,并且必须实现一个默认接口。

    // AbstractPointcutAdvisor是默认接口

    public class LogAdvisor extends AbstractPointcutAdvisor {

        private Advice advice; // Advice

        private Pointcut pointcut; // 切入点

        @PostConstruct

        public void init() {

            // AnnotationMatchingPointcut是依据修饰类和方法的注解进行拦截的切入点。

            this.pointcut = new AnnotationMatchingPointcut((Class) null, Log.class);

            // 通知

            this.advice = new LogMethodInterceptor();

        }

    }

    相关文章

      网友评论

        本文标题:spring aop基本概念

        本文链接:https://www.haomeiwen.com/subject/cuwiqktx.html