Spring 的 AOP 究竟可以做什么?

前言

对于 Spring 的初学者来说,Spring AOP 这个词儿真显的高大上,让人摸不着头脑。举个栗子,常常我们在开发的时候,会发现会做大量重复的工作。例如,一个管理系统,每次用户请求的时候,我们都需要检查他的权限是否足够。问题出现了,如果系统非常复杂,很多方法都需要权限的检查,日后可能还会继续增加。这种时候,我们不可能在每个方法都写好权限检查的代码,这样会造成代码的非常多非常冗余。所以,类似于权限检查这种活儿,我们抽象出来作为一部分,然后每次用户请求的时候,我们都会现执行抽象出来的权限检查,这样就非常方便了。但是怎么实现呢?这就需要用到了 AOP。 

AOP 其实是一个“横切”技术。它可以在剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块。

看前一句话,我们再拿权限检查来理解。每个方法的逻辑都不同,做的事情也不同,所以我们称这些逻辑为每个方法的核心代码。而权限检查这部分不是每个方法的核心,它只是影响了这个类的核心代码是否执行,而且每个方法执行前,权限检查这段代码都是相同的,也就是可重用模块,所以我们称之为非核心代码。那怎么使用把可重用模块和核心代码分离开来又可以使用呢?答案是使用 AOP 将可重用模块,也就是权限检查,切入到目标方法的内部中,这样既解耦两个模块,也达到了代码重用,防止代码冗余的地步。


实现 AOP 的技术

两种,一种是动态代理技术,对目标对象进行代理,以此更改目标对象的行为。二是采用静态织入的方式,通过特定的语法创造切面切入,从而使编译器在编译期间就织入相关的切面。


使用方式(四种)

基于代理的 AOP

纯 Java 对象切面

@Aspect 注解

注入式的 Aspect 切面


AOP 术语

连接点(Joinpoint:例如方法执行的位置,如类开始初始化前、类初始化后、类某个方法调用前、调用后、方法抛出异常后。

切点(Pointcut

增强(Advice:增强是指织入连接点的那一段代码。

目标对象(Target):指增强逻辑织入的目标类。如果

引介(Introduction):

织入(Weaving 织入是将增强添加对目标类具体连接点上的过程。根据 jvm,我们知道有不同的时期。而 AOP 在织入的时间,分为:  

  • 编译器织入,这要求使用特殊的 Java 编译器
  • 类装载期织入,这要求使用特殊的类装载器
  • 动态织入,在运行期为目标类添加增强生成子类的方式。

Spring 采用动态代理,而 AspectJ 采用的是编译期织入和类装载器织入。

代理(Proxy):指被 AOP 织入后的结果类。融合了原类和增强的逻辑类。

切面(Aspect



应用场景

日志、权限检查、






feia 

你可能感兴趣的:(Spring)