前言
这段时间在学习JavaWeb的一些框架,之前写了一篇关于IOC(控制反转的),这次来把Spring另一个重要的思想给补上——Spring AOP
为什么会产生AOP
我们知道Java是一门面向对象的编程语言,而AOP,翻译过来就是面向切面。
在实际的web工程中,比如传统的电商项目,交易系统和财务系统,交易系统存在一个交易记录的对象,而财务系统则存在账户的信息对象,在实际使用中,我们往往的需要对交易系统和财务系统进行统一的事务管理,要么全部成功,要么全部失败。
传统的面向对象编程,需要把交易系统中的对象和财务系统中的对象在一个事务中控制,这个显然部署面向对象编程能够解决的,但面向切面却可以,这里的切面环境就是数据库事务。
AOP具体是什么
通过Java的动态代理设计模式我们可以知道,动态代理可以允许我们在真实对象访问之前或者之后加入对应的逻辑,AOP的实质,跟动态代理很像很像。
关于面向切面编程的一些术语:
切面(Aspect): 切面用于组织多个Advice,Advice放在切面中定义。
连接点(Joinpoint): 程序执行过程中明确的点,如方法的调用,或者异常的抛出。在Spring AOP中,连接点总是方法的调用。
增强处理(Advice): AOP框架在特定的切入点执行的增强处理。处理有"around"、"before"和"after"等类型
切入点(Pointcut): 可以插入增强处理的连接点。简而言之,当某个连接点满足指定要求时,该连接点将被添加增强处理,该连接点也就变成了切入点。
案例一
B站狂神老师的视频讲解
这里我把主体代码贴上
@Aspect//标注这个类是一个切面
public class AnnotationPointCut {
@Before("execution(* com.kuang.service.UserServiceImpl.*(..))")
public void before(){
System.out.println("====方法执行前====");
}
@After("execution(* com.kuang.service.UserServiceImpl.*(..))")
public void after(){
System.out.println("====方法执行前====");
}
//在环绕增强中,我们可以给定一个参数,代表我们要获取处理切入的店
@Around("execution(* com.kuang.service.UserServiceImpl.*(..))")
public void around(ProceedingJoinPoint jp) throws Throwable {
System.out.println("环绕前");
Signature signature = jp.getSignature();//获得签名
System.out.println("signature:"+signature);
//执行方法
Object proceed = jp.proceed();
System.out.println("环绕后");
}
}
看过视频的同学们可以看到,狂神老师的案例中,并没有对原代码add,delete,update等方法进行修改,但通过spring的AO却巧妙的实现了动态代理!
动态代理可以允许我们在真实对象访问之前或者之后加入对应的逻辑相,当于我们把事务管理的内容,横向切近了程序中,当程序运行的主体业务的时候我们可以对事务进行一个事务同一的管理1
案例二
这里我拿数据库使用AOP后实现的事务管理作为例子,两张图就很明显的看出了AOP的作用
无AOP的SQL执行:
加入AOP之后的SQL语句执行:
AOP的作用
AOP专门用于处理系统中分布于各个模块(不同方法)中的交叉关注点的问题,在JavaEE应用中,常常通过AOP来处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等,AOP已经成为一种非常常用的解决方案。
小结
其实不仅仅是在Spring中,我们在使用Java的时候也有意无意中使用到了AOP,只不过我们不知道这种思想叫做AOP而已,这个之前的IOC一样的。我们重点是学习这个思想,而不单单局限于代码的编写,掌握思想才是我们学习的重点!