博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AOP面向切面编程【图文教程】_第1章
阅读量:2139 次
发布时间:2019-04-30

本文共 2611 字,大约阅读时间需要 8 分钟。

平凡也就两个字: 懒和惰;

成功也就两个字: 苦和勤;
优秀也就两个字: 你和我。
跟着我从0学习JAVA、spring全家桶和linux运维等知识,带你从懵懂少年走向人生巅峰,迎娶白富美!
关注微信公众号【 IT特靠谱 】,每一篇文章都是心得总结,跟我学习你就是大牛!

 

AOP面向切面编程【图文教程】_第1章

--AOP面向切面编程基本概念和术语

 

1 前言

      AOP(Aspect-oriented Programming)面向切面编程, AOP是对OOP(面向对象编程)的补充。

      面向对象编程(OOP):是一种自上而下的编程思想。基本单元:class。例如:当调用controller层的方法时,会依次调用controller-->service--->dao层。假如我想给每个controller方法添加打印执行时间的代码,那么OOP模式就需要给每个controller方法添加如下代码:

 

      假如我们需要优化记录执行时间的代码,那么我们就需要修改每一个controller方法!天呐!但是AOP能解决这个问题!

      面向切面编程(AOP):是一种横切编程的思想。基本单元:Aspect切面。上图1和3步跟业务逻辑无关,2步才是真正的业务逻辑处理的地方。把记录时间日志和业务处理逻辑耦合在一起是一件非常不理智的做法,AOP完美解决了这个问题:AOP面向切面编程以横切的方式增强了业务逻辑,使得业务逻辑和非业务逻辑解耦,让开发人员更专注于业务逻辑开发!

      扩展1:在spring中,事务控制和日志记录等用到了AOP面向切面编程技巧!!然而AOP是通过代理来实现的!

      扩展2:Spring代理有两种:(1)spring AOP:spring默认实现的jdk动态代理;

                                                   (2)AspectJ:AspectJ框架实现的cglib动态代理。

                  Spring 代理默认使用标准的jdk动态代理来代理对象,要求被代理的对象必须至少实现1个接口。Spring代理也可以用cglib来代理对象,cglib是用来代理class的,而不是代理interface的。我们建议代理对象实现接口,通过jdk动态代理来代理对象。也就是说:被代理的业务对象如果没有实现接口,那么会用cglib动态代理来代理;如果业务对象实现了接口,那么会用jdk动态代理来代理。

 

2 AOP术语

2.1  Aspect:切面

      Aspect切面由 pointcut 和 advice 组成, 它既包含了横切逻辑的定义, 也包括了连接点的定义. Spring AOP就是负责实施切面的框架, 它将切面所定义的横切逻辑织入到切面所指定的连接点中。AOP的工作重心在于如何将增强织入目标对象的连接点上, 这里包含两个工作:(1)如何通过 pointcut 和 advice 定位到特定的 joinpoint 上;(2)如何在 advice 中编写切面代码。

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

 

2.2  join point:连接点

      程序执行过程中明确的点,一般是方法的调用。

 

2.3  Pointcut:切入点

      就是带有通知(意味着会被执行、走到)的连接点,在程序中主要体现为书写切入点表达式。连接点和切入点的理解(借用某大佬的比喻):

 

 

2.4  Advice:通知

      AOP在特定的切入点(pointcut)上执行的增强处理(切面代码)。有如下5种通知类型:

    (1)before:前置增强

    (2)after:后置增强

    (3)Around:环绕增强

    (4)afterThrowing:异常抛出后增强

    (5)afterReturning:业务逻辑返回后增强

      通知的理解:通知定义了切面要干什么、要执行什么代码,以及它将于何时被调用。而切入点定义了切面代码将于何处被执行,可以想到,通知和切入点是搭配使用的,即“通知切入点将于何时执行"通知"这段代码”。

      通知类型细说:通知也是有优先级、顺序的,虽然从下面的描述大致可以猜出来执行优先级,但这里还是描述下。进入目标方法时,先织入Around,再织入Before,退出目标方法时,先织入Around,再织入AfterReturning,最后才织入After。注意:Spring AOP的环绕通知会影响到AfterThrowing通知的运行,不要同时使用!同时使用也没啥意义。

 

 

2.5  Target object:目标对象或被通知对象

       被通知对象,指被织入Advice通知的对象。该对象是一个在运行时创建的AOP代理对象(接口类型通过jdk动态代理类代理,普通类通过cglib代理对象代理)!

织入 advice 的目标对象也被称为 advised object。因为 Spring AOP 使用运行时代理的方式来实现 aspect, 因此 adviced object 总是一个代理对象(proxied object)。注意, adviced object 指的不是原来的类, 而是织入 advice 后所产生的代理类

 

2.6  AOP proxy:AOP代理

      通过AOP框架创建的代理对象能够执行Advice通知的增强代码。代理对象就是通过AOP代理类创建的,在spring框架中,AOP代理有两类:JDK动态代理和cglib代理

      Spring AOP 默认使用标准的 JDK 动态代理(dynamic proxy)技术来实现 AOP 代理, 通过它, 我们可以为任意的接口实现代理。如果需要为一个实现代理, 那么可以使用 CGLIB 代理。当一个业务逻辑对象没有实现接口时, 那么Spring AOP 就默认使用 CGLIB 来作为 AOP 代理了. 即如果我们需要为一个方法织入 advice, 但是这个方法不是一个接口所提供的方法, 则此时 Spring AOP 会使用 CGLIB 来实现动态代理. 鉴于此, Spring AOP 建议基于接口编程, 对接口进行 AOP 而不是类

 

2.7  Weaving:织入

      将 aspect 和其他对象连接起来, 并创建 adviced object 的过程。将通知织入到被增强对象的指定切入点!Spring 采用动态代理织入, 而AspectJ采用编译器织入和类装载期织入。

     下一章节将详细介绍aop面向切面编程的使用姿势!如果以上教程对您有帮助,为了不迷路,请关注一下吧~

 

转载地址:http://rupgf.baihongyu.com/

你可能感兴趣的文章
(PAT 1143) Lowest Common Ancestor (二叉查找树的LCA)
查看>>
(PAT 1061) Dating (字符串处理)
查看>>
(PAT 1118) Birds in Forest (并查集)
查看>>
数据结构 拓扑排序
查看>>
(PAT 1040) Longest Symmetric String (DP-最长回文子串)
查看>>
(PAT 1145) Hashing - Average Search Time (哈希表冲突处理)
查看>>
(1129) Recommendation System 排序
查看>>
PAT1090 Highest Price in Supply Chain 树DFS
查看>>
(PAT 1096) Consecutive Factors (质因子分解)
查看>>
(PAT 1019) General Palindromic Number (进制转换)
查看>>
(PAT 1073) Scientific Notation (字符串模拟题)
查看>>
(PAT 1080) Graduate Admission (排序)
查看>>
Play on Words UVA - 10129 (欧拉路径)
查看>>
mininet+floodlight搭建sdn环境并创建简答topo
查看>>
【linux】nohup和&的作用
查看>>
Set、WeakSet、Map以及WeakMap结构基本知识点
查看>>
【NLP学习笔记】(一)Gensim基本使用方法
查看>>
【NLP学习笔记】(二)gensim使用之Topics and Transformations
查看>>
【深度学习】LSTM的架构及公式
查看>>
【python】re模块常用方法
查看>>