Aop ( Aspect Oriented Programming )面向切面编程;是现在比较常用的一种技术;
Aop是在你的不增加代码的情况下,添加功能点:加入日志 ;事务管理;缓存等等;
Aop使用的是动态代理完成操作;
代理分为两种代理: 1.静态代理 ;动态的代理 ;
静态代理:不会变化:有一个汽车代理商(长安) ;他只能卖长安汽车; ( 这
个不会发生变化; )
动态代理:他是可以变化的;汽车代理商(什么车都可以)其实他没有给任何一个
做静态代理;他的代理一直在变化;
Spring中使用很多的代理是cglib代理(代码库) ;
Hibernate作为一个非常好的orm的框架;也使用cglib 代理;实现单端操作一对多;一对一的操作)
CGLIB底层使用了ASM (一个短小精悍的字节码操作框架)来操作字节码生成新的类。
除了CGLIB库外,脚本语言(如Groovy何BeanShell )也使用ASM生成字节码。ASM
使用类似SAX的解析器来实现高性能。
Spring中的aop使用场景:
- Aop是作为我们的切面来使用:性能监控( druid ) , 访问控制(单点登录)事务管理(添加,删除,修改)都要进行事务的操作;缓存数据;当你的业务走到这个切面上的时候;写缓存;对象池管理;以及日志管理; (tomcat的启动都回打日志)
- Aop把我们分散在多个业务层面,多种逻辑的代码中的操作,通过一个切面进行拦截;(把他的具体的的操作抽取出来放在切面上;当你的这个方法进入到这个切面上的时候,就会调用切面上写好的哪个方法(面向切面的编程的方法) ; )
- Aop实现的关键就是因为aop有动态的代理; Aop代理的时候:一种是静态的代理;动态的代理;
- 编译时增强:他就是aop框架通过命令的方式进行编译;在编译的这个阶段就可以生成我们的代理类; (静态代理)
- 运行时增强:动态代理是在运行的时候借助我们的jdk的动态代理;产生代理对象;
在以后我们的项目开发的过程中:日志管理;缓存操作;事务管理;性能管理;使用的频率都比较大;
Aop中的概念:
- 切面: ( ascept)其实就是共有功能的实现。如日志切面、权限切面、事务切面等。在实际应用中通常是一个存放共有功能实现的普通Java类,之所以能被AOP容器识别成切面,是在配置中指定的。(这个就相当是我们的安检门)
- 通知:( advice )是切面的具体实现。以目标方法为参照点,根据放置的地方不同,可 分为前置通知(Before )、后置通知( AfterReturning )、异常通知( AfterThrowing ) 最终通知( After)与环绕通知( Around ) 5种。在实际应用中通常是切面类中的一个 方法,具体属于哪类通知,同样是在配置中指定的。其实也就是一个拦截器(安检 门上的那些嵌入式的检测设备)
- 连接点( ) ( Joinpoint ) :其实就是你的程序从哪个点进入到切面;例如,方法调用、 异常抛出或字段修改等,但Spring只支持方法级的连接点。(就是我们有吃饭的需求他就是连接你的主流业务和切面直接的一个连接点)这样通 过这个连接点把业务和和饭店就联系起来;
- 切入点: (Pointcut)用于定义通知应该切入到哪些连接点上。不同的通知通常需要切入到不同的连接点上,这种精准的匹配是由切入点的正则表达式来定义的。
- 目标对象(Target) :就是那些即将切入切面的对象,也就是那些被通知的对象。这些对象中已经只剩下干干净净的核心业务逻辑代码了,所有的共有功能代码等待AOP容器的切入。他就相当我们的 乘坐地铁;饭店里边吃饭;
- 代理对象( Proxy) :将通知应用到目标对象之后被动态创建的对象。可以简单地理解为,代理对象的功能等于目标对象的核心业务逻辑功能加上共有功能。代理对象对于使用者而言是透明的,是程序运行过程中的产物。( 这个是由我们的springaop提供代理对象)
- 织入( Weaving ) :将切面应用到目标对象从而创建一个新的代理对象的过程。 这个过程可以发生在编译期、类装载期及运行期,当然不同的发生点有着不同的前提条件。譬如发生在编译期的话,就要求有一个支持这种AOP实现的特殊编译器;发生在类装载期,就要求有一个支持AOP实现的特殊类装载器;只有发生在运行期,则可直接通过Java语言的反射机制与动态代理机制来动态实现。