AOP即Aspect Oriented Program面向切面编程编程
总所周知,Java是一门面向对象(OOP)编程语言。面向对象的特色是封装、继承和多态。而封装就是将不一样的功能封装到不一样的对象中(职责分配,例如在作登陆、删除等业务时就会封装为独立的类),增长了代码复用性,下降了代码复杂程度。
可是在职责分配的代码中,也增长了部分代码的重复性。好比在添加性能统计、日志、事务管理的代码时,就须要在每一个功能的代码文件中添加剧复的代码。固然也能够把这部分代码从新封装到一个新的类中,但这样一来上面哪些独立的功能封装类就出现了耦合。那怎样才能在代码中随意的加入代码且不破坏类的封装呢?这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。
面向切面编程基于动态代理实现。
OOP从纵向上区分出一个个类来,而AOP从横向上加入特定的代码。以下图:
OOP: 缓存
Joinpoint链接点:被拦截须要曾强的方法。where:到哪里去作曾强编程语言
Pointcut:切入点,哪些包中的哪些类中的哪些方法,可认为是链接点的集合。性能
Advice:加强,当拦截到Joinpoint以后,在方法执行的什么时机(when)作什么样(what)的加强.
根据时机分为:前置加强、后置加强、异常加强、最终加强、环绕加强。代理
Aspect:切面,Pointcut+Advice,去那些地方+在什么时机+作什么加强日志
Target:目标对象,被代理的目标对象cdn
Weaving:织入,把Advice加到Target上以后,建立出Proxy对象的过程。对象
Proxy:一个类被AOP织入加强后,产生的代理类。blog
加强 | 备注 | 应用场景 |
---|---|---|
aop:before(前置加强) | 在方法执行以前执行加强 | 权限控制、记录调用日志等 |
aop:after-returning(后置加强) | 在方法正常执行完成以后执行加强(中间没有遇到任何异常) | 统计分析结果数据 |
aop:throwing(异常加强) | 在方法抛出异常退出时执行加强 | 经过日志记录方法异常信息 |
aop:after(最终加强) | 在方法执行以后,至关于在finally里面执行;能够经过配置throwing来得到拦截到的异常信息 释放资源 | |
aop:around(环绕加强) | 最强大的一种加强类型,环绕加强能够在方法调用先后完成自定义的行为,环绕加强有两个要求: 1. 方法须要返回一个Object(返回的结果)2. 方法的第一个参数必须是ProceedingJoinPoint(能够继续向下传递链接点) | 缓存、性能日志、权限、事务管理等 |