文章目录
- AOP应用背景
- AOP介绍
- AOP七大术语
- 切点表达式
AOP应用背景
一天,项目经理突然跟我说:官网后端管理系统需要增加“用户操作流水功能”!啥,用户操作流水?对,记录后台管理用户的所有增删改查的操作,有操作人,操作描述,操作时间,操作url等信息。。。好的,保证完成任务!
思考:增加用户操作流水会带来什么问题?
1.目前官网管理后台的所有业务功能都已经线上正常运行了,要改动现有正常运行的线上代码,有很大的风险。
2.能不能在不影响正常业务代码的情况下,零浸入式的实现用户操作流水功能?
3.不可能使用大量冗余的代码,给所有不同的业务功能都加上相同的操作流水的代码,这样无疑是重复且巨大的工作量!
于是它来了,AOP-面向横切面编程。
AOP介绍
如上背景介绍所述:记录用户操作流水实际上就是给系统增加用户“日志”的系统功能。像:日志,事务管理,安全等,这些系统服务被称为"交叉业务"这些"交叉业务"几乎是通用的,这些交叉业务时每个项目系统都需要的。"交叉业务"在系统中的影响1.如果交叉业务代码在多个业务流程中反复出现,显然这个交叉业务代码没有得到复用,如果将来交叉业务代码又需要修改的话,会出现牵一发而动全身的连锁反应。2.这些"交叉代码"无关于业务代码,植入业务代码中侵入型很大,后期不好维护,应该抽取出来
AOP:将于核心业务无关的代码独立的抽取出来,形成一个独立的组件,然后以横向交叉的方式切入到业务流程当中。
AOP(Aspect Oriented Programming):面向切面编程,面向方面编程AOP是对OOP的补充延伸,AOP底层就是由动态代理来实现的。Spring的AOP使用的动态代理是:JDK动态代理+CGLib动态代理技术。Spring在这两种动态代理中灵活切换,如果是代理接口,会默认使用JDK动态代理,如果要代理某个类,这个类没有实现接口,就会切换使用CGLib,当然,你也可以强制通过一些配置让Spring只使用CGlib。AOP的优点:1.代码复用性增强2.代码易于维护3.使开发者更关注业务逻辑
AOP七大术语
连接点(Joinpoint):在程序的整个执行流程中,可以织入切面的位置,例如方法的执行前后,异常抛出之后等位置。切点(Pointcut):在程序执行流程中,真正织入切面的方法(一个切点对应多个连接点)通知(Advice):通知也称增强,就是具体你要织入的代码。通知包括;前置通知,后置通知,环绕通知,异常通知,最总通知● 前置通知(Before):在目标方法调用前调用通知功能;● 后置通知(After):在目标方法调用之后调用通知功能,不关心方法的返回结果;● 环绕通知(Around):通知包裹了目标方法,在目标方法调用之前和之后执行自定义的行为;● 异常通知(AfterThrowing):在目标方法抛出异常后调用通知功能;● 最终通知(AfterReturning):在目标方法成功执行之后调用通知功能;切面(Aspect): 切点+通知就是切面织入(Weaving): 把通知应用到目标对象上的过程代理对象(Proxy): 一个目标对象被织入通知后产生的新对象目标对象(Target): 被织入通知的对象
切点表达式
切点表达式用来定义通知(Advice)往哪些方法上切入
切入点表达式格式:
execute([访问控制权限修饰符] 返回值类型 [全限定类名]方法名(形式参数列表) [异常])访问控制权限修饰符:1.可选项,没写就是4个权限都包括2.些public就表示值包括公开的方法返回值类型:1.必填项2.*表示返回值类型任意全限定类名:1.可选项2.两个点".."代表当前包以及子包下的所有类。3.省略时表示所有的类。方法名:1.必填项2.*表示所有方法3.set*表示所有的set方法形式参数列表:1.必填项2.()表示没有参数的方法3.(..)参数类型和个数随意的方法4.(*,String)第一个参数类型随意,第二个参数是String的//com.macro.mall.controller包中所有类的public以delete开头的方法都应用切面里的通知execution(public * com.macro.mall.controller.*.delete*(..))//com.macro.mall包及包含controller的子包下所有类中的所有方法都应用切面里的通知execution(public * com.macro.mall.*.controller.*.*(..))//com.macro.mall.controller.PmsBrandController类中的所有方法都应用切面里的通知execution(* com.macro.mall.controller.PmsBrandController.*(..))//所有类的所有方法execution(* *(..))