AOP(Aspect-OrientedProgramming,面向切面编程)
总的来说,开发过程中会有很多与具体业务无关的代码,如日志代码等。任何一个功能模块都将产生日志,代码的重复出现,导致日志一旦发生变化,多个模块就要进行大量的修改工作,可想而知,重复性的工作是很多的。因此AOP针对这一现象进行了很好的解决,将与业务无关的代码抽取出来进行了封装(切面)。
AOP的基本概念
- (1)Aspect(切面):通常是一个类,里面可以定义切入点和通知
- (2)JointPoint(连接点):程序执行过程中明确的点,一般是方法的调用
- (3)Advice(通知):AOP在特定的切入点上执行的增强处理,有before,after,afterReturning,afterThrowing,around
- (4)Pointcut(切入点):就是带有通知的连接点,在程序中主要体现为书写切入点表达式
- (5)AOP代理:AOP框架创建的对象,代理就是目标对象的加强。Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类
上面说过日志在AOP中的使用情况;实际开发中也会有其他的情况,比如人的信息查询,以列表的方式返回,通过使用AOP可以很好的脱敏处理(身份证号隐藏几位,保护其隐私)。
通知方法:
- 前置通知:在我们执行目标方法之前运行(@Before)
- 后置通知:在我们目标方法运行结束之后 ,不管有没有异常(@After)
- 返回通知:在我们的目标方法正常返回值后运行(@AfterReturning)
- 异常通知:在我们的目标方法出现异常后运行(@AfterThrowing)
- 环绕通知:动态代理, 需要手动执行joinPoint.procced()(其实就是执行我们的目标方法执行之前相当于前置通知, 执行之后就相当于我们后置通知(@Around)
因spring MVC和Spring是无缝的,现大多数使用springboot,简化了一些配置;SpringMVC是方法级别的拦截,一个方法对应一个Request上下文,所以方法直接基本上是独立的,独享request,response数据。在使用@Aspect时可以在方法中进行一些切面的处理。