1.AOP的应用
安全
日志
事务管理
缓存
异常处理


2.静态AOP与动态AOP
静态AOP
概念:将切面以Java字节码的形式编译到系统的各个功能模块中,以达到融合Aspect和class的目的。
优点:切面逻辑直接以字节码的形式编译到Java类中,Java虚拟机就像通常一样加载并运行,不会对系统运行造成任何的性能 损失。
缺点:缺乏灵活性。如果横切关注点需要改变织入到系统的位置,就需要重新修改Aspect的定义文件,然后使用编译器重新编 译Aspect并重新织入到系统中。

动态AOP
概念:通过Java语言提供的各种动态特性来实现Aspect织入到当前系统的过程。AOP的织入过程在系统运行之后进行,而不是 预先编译到系统类中,而且织入信息大都采用外部XML文件格式保存。
优点:灵活性、易用性。可以在调整织入点和织入逻辑单元的同时,不必变更系统其他模块,甚至在系统运行的时候,也可以 动态的更改织入逻辑。
缺点:性能问题。因为动态AOP的实现大都在类加载或者系统运行期间,采用对系统字节码进行操作的方式来完成Aspect到系 统的织入,难免会造成一定的运行时性能的损失。

3.Java平台上的AOP实现机制

①动态代理

②动态字节码增强

③自定义类加载器
通过自定义类加载器完成横切逻辑到系统的织入,自定义类加载器通过读取外部文件规定的织入规则和必要信息,在加载class文件期间就可以将横切逻辑添加到系统模块类的现有逻辑中,然后将改动后的class交给JVM运行。
缺点:最大的问题是类加载器本身的使用。某些应用服务器会控制整个的类加载体系,所以,在这样的场景下使用可能会造成一定的问题

4.Spring AOP的实现机制
定义Pointcut、Advice、Advisor等类。
Advisor用于将Advice与PointCut结合起来,用于定义将哪个Advice在哪个PointCut上使用。
在ProxyFactoryBean的实现中为target目标对象生成Proxy代理对象,从而为AOP横切面的编织做好准备。
对ProxyFactoryBean来说,把需要对target目标对象的增强处理,都通过getObject方法进行封装,增强处理是通过初始化通
知器链initializeAdvisorChain()方法来实现的,这些增强处理是为AOP功能的实现提供服务的。
ProxyFactoryBean生成的是AopProxy对象,ProxyFactoryBean中又是通过AopProxyFactory来创建AopProxy,AopProxyFactory
使用的是DefaultAopProxyFactory

拦截器调用的实现是在AopProxy接口的实现JdkDynamicAopProxy的invoke方法中或Cglib2AopProxy中intercept方法中

JDK和CGLIB会生成不同的AopProxy代理对象,从而构造了不同的回调方法来启动对拦截器链的调用,比如在
JdkDynamicAopProxy中的invoke方法以及CglibAopProxy中使用DynamicAdvisedInterceptor的intercept方法。他们都使用了不同的AopProxy代理对象但最终殊途同归,他们对拦截器链的调用都是在ReflectiveMethodInvocation中通过proceed方法实现的。在proceed方法中会逐个运行拦截器的拦截方法,在运行拦截方法前需要对代理方法完成一个匹配判断,来决定是否实行增强。


JDK生成的AopProxy代理对象的invoke方法,CGLIB生成的代理对象的intercept方法来实现拦截功能的。取得拦截器链的工作
由配置好的advisorChainFactory来完成,由DefaultAdvisorChainFactory中实现interceptor链的获取过程

静态的TargetSource总是返回同一target。动态的TargetSource可以用来支持连接池、热交换(hot swapping)等