美文网首页
5-AOP——5-1引入及概述

5-AOP——5-1引入及概述

作者: 鹏程1995 | 来源:发表于2020-02-25 16:17 被阅读0次

    概要

    过度

    我们上面记录了 BeanFactory的增强——ApplicationContext。到那里基本上Spring的最常用的两大特性之一:依赖注入已经讲完了。接下来我们开始分析Spring最常用的第二大特性:面向切面。

    AOP,全称 Aspect Oriented Programming ,即面向对象编程,是对 Java 的 OOP (Object Oriented Programming)的一个非常有效的补充,可以在不侵入Java核心业务代码的情况下对一些通用操作进行补全。

    内容简介

    本文主要对AOP进行引入,同时对Spring中AOP的实现进行整体思路的梳理,方便后面对AOP的实现环节进行一一介绍。

    所属环节

    AOP引入、总览

    上下环节

    上文: 对Spring依赖注入的完整介绍

    下文: 对Spring中AOP各个实现环节的详细介绍

    思路概述

    跟对我对Spring的AOP项目的粗略阅读,我认为Spring对AOP的实现主要分为以下两步:

    1. 根据各种增强的配置信息,创建动态代理实例
    2. 创建的动态代理执行过程中安排好各种增强

    其中,最开始我以为创建动态代理的思路如下:

    1.png

    主要分成两个环节,第一环节是生成增强器Advisor并完成注册。第二环节是根据生成的Advisor,对需要的实例创建代理。后来才反应过来,并不是在扫描到aop的标签就进行对应增强器的扫描和注册的,因为在扫描这个标签后面可能继续扫描,这里还没注册全。所以,应该使用懒加载,因为在开始创建实例时,一定是加载完成的:

    2.png

    创建好的动态代理的使用思路也很简单,因为增强器的配置是灵活的,所以Spring采用了拦截器链的方法进行实现:

    3.png

    时序图画的相当粗糙,但大概意思就是这样。

    我们接下来会分三节来介绍Spring的AOP实现原理,分别从

    1. 根据Bean实例找出合适的增强器
    2. 处理Bean实例并根据需求创建动态代理
    3. 动态代理的工作原理

    三个环节介绍Spring的AOP的实现原理。

    源码解析

    入口

    照例我们这里选择一个能贯穿Spring的AOP编程的Demo。我们在使用AOP时一般都会先在对应的xml中配置:

    <aop:aspectj-autoproxy />
    

    来激活Spring扫描@Aspect的功能,然后会自行定义一个类来声明一个切面:

    @Aspect
    @Component
    public class LogAspect {
    
        private Logger logger = LoggerFactory.getLogger(LogAspect.class);
    
    
        @Around(value = "@annotation(com.LogPoint)")
        public Object executeAnnotation(ProceedingJoinPoint jp) throws Throwable {
          // do something
          Object obj = jp.proceed();
          // do something
          return obj;
        }
    }
    

    这样就完成了对Spring的AOP编程,被 com.LogPoint注解的类/方法在调用的前后会执行你写的逻辑。

    扩展

    AOP 的几个注解的使用,我记得之前专门记录过,温习一遍。

    问题遗留

    参考文献

    相关文章

      网友评论

          本文标题:5-AOP——5-1引入及概述

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