1,AOP和OOP的对比
名称 | 解释 | 业务侧重 | 结构侧重 |
AOP | 切面编程 | 偏重于业务处理过程的某个步骤或者阶段,强调降低模块之间的耦合度,是代码拥有更好的移植性 | 是横向结构的,它针对于业务逻辑层的切面进行提取,把每个业务所涉及的公共部分(事务管理、日志记录、线程安全等)全部抽取出来 |
OOP | 面向对象编程 | 对业务分析过程中抽取的实体进行方法和属性的封装 | 是纵向结构的,它能够使我们设计的一个业务逻辑对象单元更加清晰 |
2,AOP的一些术语
术语 | 解释 |
连接点 | 程序执行的某个位置:类开始初始化前、类初始化后、类调用某个方法前、类调用某个方法后、方法抛出异常后。一个类或者一段代码拥有一些具有边界性质的特定点,这些特定点就是连接点 |
切点 | 连接点相当于数据库中的记录,而切点相当于查询条件 |
增强 | 增强是植入到目标类连接点上的一段程序代码 |
目标对象 | 增强逻辑植入的目标类 |
引介 | 引介是一种也是的增强,它为类添加一些属性和方法 |
织入 | 织入是将增强添加对目标类具体连接点的过程 |
代理类 | 一个类被AOP织入增强后,就产生了一个结果类,它是融合了原类和增强逻辑的代理类,根据不同的代理方式,代理类即可能是和原类具有同样接口的类,也可能就是原类的子类 |
切面 | 切面是由切点和增强(引介)组成,它既包括横切逻辑定义,也包括了连接点的定义,Spring AOP就是负责实施切面的框架,它将切面所定义的横切逻辑织入到切面所指定的连接点中 |
3,Java的动态代理和CGLib动态代理的区别
SpringAOP的底层是通过JDK动态代理或CGLib动态代理技术为目标Bean织入横切逻辑的。
代理名称 | 面向的对象 | 实现方式 | 综合比较 |
Java | Java的接口 | 通过Java的Proxy和InvocationHandler的合作,其中InvocationHandler是一个接口,可以通过实现该接口定义横切逻辑,并通过反射机制调用目标类代码,动态地将横切逻辑和业务逻辑编制在一起 | CGLib不对目标类做任何限制。JDK在创建代理对象时性能高于CGLib,而生成代理对象的运行性能却比CGLib地,如果是singleton的代理,推荐使用CGLib |
CGLib | Java的类 | CGLib采用非常底层的字节码技术,可以为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,并顺势织入横切逻辑 |
4,增强的类型
1) 前置增强:在目标方式执行前增强
2) 后置增强:在目标方法执行后增强
3) 环绕增强:在目标方法执行前后实施增强
4) 异常抛出增强:在目标方法抛出异常后增强
5) 引介增强:在目标类中添加一些新的方法和属性,是类级别的增强
5,切点的类型
名称 | 解释 |
静态方法切点 | 存在一个静态方法切点的抽象基类,默认情况下它匹配所有的类 |
动态方法切点 | 存在一个动态方法切点的抽象基类,默认情况下匹配所有类 |
注解切点 | 匹配注解 |
表达式切点 | 为了支持AspectJ切点表达式语法而定义的接口 |
流程切点 | 根据程序执行堆栈的信息查看目标方法是否由某一个方法直接或间接发起调用,以此判断是否为匹配的连接点 |
复合切点 | 为创建多个切点而提供的方便操作类 |
6,切面的类型
1) Advisor:代表一般的切面,它仅包含一个Advice(增强,既包含横切代码,又包含部分的连接点信息),由于Advice代表的横切连接点是所有目标类的所有方法,所以不会直接使用。
2) PointcutAdvisor:代表具有切点的切面,它包含Advice和Pointcut两个类
3) IntroductionAdvisor: 代表引介切面,引介切面是引介增强和引介切点(ClassFilter)的结合