什么是spirngAop,SpringAop的理解

什么是springAOP?

AOP(Aspect Oriented Programming),面向切面编程,还有我们熟知的OOP(面向对象编程)POP(面向过程编程)

​用官方的介绍面向切面编程通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

看着这一段官方解释感觉很晦涩难懂,其实简单来说,Aop就是用来对我们的程序的方法通过动态代理的方式对我们的核心代码进行功能增加和或者增强等,让我们的原始类或者方法的维护性更高,降低耦合。看到这儿感觉还是不懂请往后看,我会有一个生动形象的例子进行说明。

比如:

  • 日志记录
  • 性能统计
  • 安全控制
  • 事务处理
  • 异常处理等

使用传统对方法进行功能性增强

public class Demo01 {
    public static void main(String[] args) {
        Car car = new Car();
        car.carRun();
    }
}
class  Car{
    public void carRun(){
        // System.out.println("=========log===========");
        System.out.println("car is running");
    }
    
    public void carStop(){
        // System.out.println("=========log===========");
        System.out.println("car is stopping");
    }
}
复制代码

​ 这段代码中我们如果需要在每一个方法执行的前面加入一个日志记录的功能就需要在每个方法的前面加入一个打印日志的的代码,假如我们有很多的方法都需要这样的日志打印我们就需要给很多的方法加上打印日志的代码,这绝对是不太好的,这样写你可能觉得大不了复制粘贴就行,但是假如后期我要对打印的日志内容进行改变,你就很头疼,或者对其中的一些方法进行修改。这不符合我们程序员的思维,程序员应该用最少的代码做相同的事情,而且我们后期维护要更加方便。

但是在了解Aop之前建议先去了解一下Java的代理(Jdk动态代理,cglib代理) 我们这儿主要是理解Aop,Aop的原理其实就是利用动态代理技术实现的,所以就得自己去探究一下了,其实也不算很难。

但是在了解Aop之前我们要知道Aop的一些专业名词

  • Aspect(切面): Aspect 声明类似于 Java 中的类声明,在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。
  • Joinpoint (连接点):表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point。
  • Pointcut(切点):被增强的连接点是切入点
  • Advice(增强):Advice 定义了在 pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码。
  • weaving(织入):将切面应用到目标对象并导致代理对象创建的过程

看了这些专业名称,说实话我第一次了解这些的时候,看着这些专业名次也是很难受的,计算机行业总会创造一些专业性看着又晦涩难懂的名词,但是当我们理解了后,也不算这么的难

之前看过一个老师的将Aop举了一个例子,感觉对Aop的功能的理解有很好的帮助

想象一个常见,你有有个十几套房子的普通老百姓,你需要对房子进行售卖或者出租,但是你卖房子要经历一下几个步骤,比如:

1. 去贴小广告,或者在网上发布登录信息

2. 带别人去看房

3. 签合同(核心功能)

4. 卖或者租房子(核心功能)

但是你这样一个普通老百姓,哪儿有时间去做前两步事情,你就想着卖房子签合同,于是就去找了中介,于是中介就帮你把你的十几套房子去打广告,让中介带别人看房,然后你就只需要进行最后两步事情。这是个两全其美的事情。

我觉得这个例子举得很好,这就类似于Aop的功能,中介可以对很多房子进行代理帮我们售卖,就像Aop对我们的方法进行代理,增强我们的方法。我能自己写代码时我们的核心业务代码还是让我们自己来管理,但是我们需要进行日志记录或者事务管理时,就可以使用Aop来帮助我们完成

接着上面的例子,我们解释一下这些名次

  • 连接点:就是你要售卖的那10几套房子
  • 切点:你不可能把你的房子全给卖了吧,总得留个几套自己住吧,于是你要售卖的那些房子就是切点
  • 增强:就是你要找到中介帮你打广告,看房子,这就叫增强
  • 切面:由点构成面,由你要卖的那10套房子就构成了切面,切面就是你给中介进行代理的房子组合在了一起构成了切面
  • 织入:就是你将房子授权给中介的过程

这是画的一张草图,进一步理解一下这些名词 在这里插入图片描述

使用注解进行Advice

  • @Before: 在目标方法被调用之前做增强处理,只需要指定切入点表达式即可

  • @AfterReturning: 在目标方法正常完成后做增强,@AfterReturning除了指定切入点表达式后,还可以指定一个返回值形参名returning,代表目标方法的返回值

  • @AfterThrowing: 主要用来处理程序中未处理的异常,@AfterThrowing除了指定切入点表达式后,还可以指定一个throwing的返回值形参名,可以通过该形参名来访问目标方法中所抛出的异常对象

  • @After: 在目标方法完成之后做增强,无论目标方法时候成功完成。@After可以指定一个切入点表达式

  • @Around : 环绕通知,在目标方法完成前后做增强处理,环绕通知是最重要的通知类型,像事务,日志等都是环绕通知,注意编程中核心是一个ProceedingJoinPoint

这些注解的简单使用

@Aspect
@Component
public class Log {
	
    @Before("execution(public * *(..))")
    public void before(){
        System.out.println("Log before advice ");
    }
	
	@AfterReturning("")
	public void AfterReturning(){
		System.out.println("Log after returning advice ");
	}
	
	@AfterThrowing("")
	public void AfterThrowing(){
		System.out.println("Log after throwing advice ");
	}
	
	@After("")
	public void After(){
		System.out.println("Log after advice ");
	}

     @Around("")
	public void around(ProceedingJoinPoint  joinPoint,User user) throws Throwable{
		System.out.println("log start");
		System.out.println("log end");
	}*/
 
}
复制代码

这就是我对springAop的理解,本人只是一个大三的学生,如有理解错误的地方,请大家指正

猜你喜欢

转载自juejin.im/post/7031466058221682724