Spring 学习之AOP总结之基础介绍(六)

Spring 源码系列

1、Spring 学习之扩展点总结之后置处理器(一)
2、Spring 学习之扩展点总结之后置处理器(二)
3、Spring 学习之扩展点总结之自定义事件(三)
4、Spring 学习之扩展点总结之内置事件(四)
5、Spring 学习之扩展点总结之@Import(五)
6、Spring 学习之AOP总结之基础介绍(六)
7、Spring 学习之AOP总结之实现代理(七)
8、SpringBoot 学习之自动配置基本原理(八)
9、SpringBoot 学习之启动原理(九)
10、ElasticSearch学习随笔之SpringBoot Starter 操作
11、图数据库 Neo4j 学习之SpringBoot整合
12、SpringBoot 学习之常用 Filter / Advice 总结
13、SpringBoot+FastJson 优雅的过滤 Response Body
14、Spring Security + Oauth2 认证授权

前言

在 Spring之扩展点几篇文章中,对Spring的扩展点的使用进行了简单的使用,那么这些其实上都属于IOC的内容了,我们都知道Spring和主要组成就是 IOC, AOP,IOC 我们说它就是一个 Bean 的管理容器,管理着 Bean 的什么周期,从Bean扫描定义到注册销毁,都是在 IOC 中完成的。
此篇就开始 AOP吧!

一、什么是AOP?

AOP 是什么,官方解释是:

Aspect-Oriented Programming (AOP) complements Object-Oriented Programming (OOP) by providing another way of thinking about program structure. The key unit of modularity in OOP is the class, whereas in AOP the unit of modularity is the aspect. Aspects enable the modularization of concerns such as transaction management that cut across multiple types and objects. (Such concerns are often termed crosscutting concerns in AOP literature.)

One of the key components of Spring is the AOP framework. While the Spring IoC container does not depend on AOP, meaning you do not need to use AOP if you don’t want to, AOP complements Spring IoC to provide a very capable middleware solution.

用我蹩脚的英语翻译如下:

AOP 的全写是 Aspect-Oriented Programming,Aspect 是方面的意思,Oriented 是 面向…的,所以翻译成中文就是 “面向方面的编程”,也可以是 “面向切面的编程”。
AOP 是 OOP 支持的另一种方式去思考程序结构的补充。
OOP 的全称是 Object-Oriented Programming,“面向对象编程”。
在 OOP 中主要的模块单元是 类, 鉴于在 AOP 中主要的单元模块式 方面,Aspects 能使业务管理通过多种类型的方式剪切成模块化和多个对象。
AOP 是Spring的一个主要的组成部分,然而 Spring IoC 容器不会依赖于 AOP,如果你不想使用 AOP,那就可以不用它,不过Spring AOP 补充了 Spring IoC 可以去提供一个非常强大的中间方案。

算了算了,我这蹩脚的英语翻译起来真实费劲,大概意思吧。

二、AOP 的演变历程

既然 AOP 是面向切面编程,那么切面是什么呢,我个人理解切面就是一组同种类型的东西,AOP 需要实现在我们的代码的基础上,进行一定的包装,比如在我们实现的方法前,后或者异常之后在进行一些拦截处理,或者叫增强处理。

那么AOP是如何实现的呢,并不是一些钩子函数或者扩展点,而是动态代理,实际在运行时需要生成代理类的实例。

所以 Spring AOP 的诞生就是为了增强我们的实现的模块的功能,它是基于动态代理来实现的如果我们是基于接口编程的,那么有使用 JDK 提供的动态代理实现,如果没有基于接口实现,则使用 CGLIB 来实现(面试老是问到)。

在 Spring 3.2 之后,spring-core 模块引入了 CGLIB 和 ASM 的源码,所以使用起来更加的方便了。

Spring AOP 也是需要一些 Bean 来实现功能的,所以 AOP 是基于 IOC 容器来管理,不过
AOP 是纯粹的java代码实现的,只能作用于容器中的 Bean 的方法。

Spring 提供了 AspectJ 的支持,但只用到了 AspectJ 的切点解析和匹配,对于 AOP 和 AspectJ 的性能嘛,AOP 是基于代理实现的,在容器启动的时候需要生成代理对象,在方法调用上也加深了栈的深度,所有 Spring AOP 的性能没有 AspectJ 好。

三、什么是 AspectJ?

因为此文章主要是介绍 Spring AOP 的,所以对 AspectJ 做简单介绍接口。
AspectJ 是来自于 Eclipse 基金会的(官网),纯纯的静态植入,也就是通过修改代码来实现的,它的植入时机主要由 3 种,如下:

  1. Compile-time weaving:编译时期植入,如果 A 类使用了 AspectJ 添加了一个属性,B 类引用了它,这种情况下在编译的时候就需要进行植入,要不然没法编译 B 类。
  2. Post-compile weaving:编译后植入,就是在编程成 class 文件或者 jar 包,这种情况下只能编译后植入了。
  3. Load-time weaving:加载类时植入,这种情况有几种常见的方法:1、自定义类加载器,在JVM 加载类的时候实现植入;2、在 JVM 启动的时候,制定 AspectJ 提供的 agent : -javaagent:xxx/xxx/aspectjweaver.jar。

所以说呢,AspectJ 能干 SOP 干不了的很多事情,它是 AOP 编程的完全解决方案,不过 Spring AOP 是主要解决企业级开发中普遍的植入需求,没有必要完全和 AspectJ 一样。

四、AOP 的使用方式

虽然上文中有说到 AOP 和 AspectJ,不过Spring AOP 是纯的 Spring 中实现的,和 AspectJ 没有多大关系,只是延用了 AspectJ 的概念和 AspectJ 提供的 Jar 中的注解(比如:@Aspect、@Pointcut、@Before、@After 等),没有依赖到其他功能。

4.1 基于接口的配置

最早的 AOP 是基于接口的,算了,不管了,过时了。

4.2 基于 schema-based 配置

Spring 2.0 之后是通过 XML 来配置的,使用命名空间 ,也不管了,比较现在都是基于注解的。

4.3 基于 @AspectJ 的配置

使用注解的方式来配置是最方便的,不过虽然是 @AspectJ 注解,和 AspectJ 却没有关系,只是名字相同而已,就像鱼豆腐其实和鱼没有关系一样。

五、AOP简单示例

其实大部分的时候还是直接上代码,示例的话,就移步到《Spring 学习之AOP总结之实现代理》。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值