1、术语:java
1.通知(Advice) spring
想要的功能,如安全,事物,日志等。先定义好,而后在想用的地方用一下。
2.链接点(JoinPoint)
spring容许你使用通知的地方,spring只支持方法链接点,和方法有关的前先后后(抛出异常),都是链接点。
3.切入点(Pointcut)
你的一个类里,有15个方法,那就有几十个链接点了对把,可是你并不想在全部方法附近都使用通知(使用叫织入,之后再说),你只想让其中的几个,在调用这几个方法以前,以后或者抛出异常时干点什么,那么就用切点来定义这几个方法,让切点来筛选链接点,选中那几个你想要的方法。
4.切面(Aspect)
通知和切入点的结合。通知说明了干什么和何时干(何时经过方法名中的before,after,around等就能知道),切入点说明了在哪干(指定究竟是哪一个方法)编程
5.引入(introduction)
把切面用到目标类中
6.目标(target)
引入中所提到的目标类
7.代理(proxy)
怎么实现整套aop机制的,都是经过代理
8.织入(weaving)
把切面应用到目标对象来建立新的代理对象的过程。有3种方式,spring采用的是运行时,为何是运行时,后面解释。
关键就是:切点定义了哪些链接点会获得通知安全
2、AOP原理spa
核心思想:spring用代理类包裹切面,把他们织入到Spring管理的bean中。也就是说代理类假装成目标类,它会截取对目标类中方法的调用,让调用者对目标类的调用都先变成调用假装类,假装类中就先执行了切面,再把调用转发给真正的目标bean。代理
如何假装: 一、实现和目标类相同的接口,我也实现和你同样的接口,反正上层都是接口级别的调用,这样我就假装成了和目标类同样的类(实现了同一接口,咱是兄弟了),也就逃过了类型检查,到java运行期的时候,利用多态的后期绑定(因此spring采用运行时),假装类(代理类)就变成了接口的真正实现,而他里面包裹了真实的那个目标类,最后实现具体功能的仍是目标类,只不过假装类在以前干了点事情(写日志,安全检查,事物等)。日志
二、生成子类调用,此次用子类来作为假装类,固然这样也能逃过JVM的强类型检查,我继承的吗,固然查不出来了,子类重写了目标类的全部方法,固然在这些重写的方法中,不只实现了目标类的功能,还在这些功能以前,实现了一些其余的(写日志,安全检查,事物等)。对象
两种假装方式的对比:前一种兄弟模式,spring会使用JDK的java.lang.reflect.Proxy类,它容许Spring动态生成一个新类来实现必要的接口,织入通知,而且把对这些接口的任何调用都转发到目标类。后一种父子模式,spring使用CGLIB库生成目标类的一个子类,在建立这个子类的时候,spring织入通知,而且把对这个子类的调用委托到目标类。对于面向接口编程是一个最佳实践,因此不少类都是实现一个或者多个接口。继承