美文网首页
代理与AOP

代理与AOP

作者: 黄二的NPE | 来源:发表于2018-07-27 14:28 被阅读4次
  • 代理

之前我们讲nginx的时候说过,代理是指存在于我们与操作目标之间的一个东西,我们可以自己去操作目标,也可以通过代理去操作操作目标;就比如黄牛,我们可以自己去买火车票,也可以通过代理(黄牛)去买火车票。通过代理,我们可以附加更多的操作。比如操作目标里面是没有日志输出的,但是我们可以在代理类中给它加上。


  • aop

AOP是什么和优点

AOP 专门用于处理系统中分布于各个模块(不同方法)中的交叉关注点的问题,在 Java EE 应用中,常常通过 AOP 来处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等,AOP 已经成为一种非常常用的解决方案。
在进行OOP开发时,都是基于对组件(比如类)进行开发,然后对组件进行组合,OOP最大问题就是无法解耦组件进行开发,比如我们上边举例,而AOP就是为了克服这个问题而出现的,它来进行这种耦合的分离。
总而言之,AOP有以下几个优点:

  1. 用于横切关注点的分离和织入横切关注点到系统;比如上边提到的日志等等;
  2. 完善OOP;
  3. 降低组件和模块之间的耦合性;
  4. 使系统容易扩展;
  5. 而且由于关注点分离从而可以获得组件的更好复用。
AOP术语
@Before(value = "execution(* com.huangzp.test.aop.*.sayHello(..))")
public void sayHello(){
    System.out.println("我是Aop config");
}
  1. 连接点(Jointpoint):表示需要在程序中插入横切关注点的扩展点,连接点可能是类初始化、方法执行、方法调用、字段调用或处理异常等等,Spring只支持方法执行连接点,在AOP中表示为“在哪里干”;

  2. 切入点(Pointcut):选择一组相关连接点的模式,即可以认为连接点的集合,Spring支持perl5正则表达式和AspectJ切入点模式,Spring默认使用AspectJ语法,在AOP中表示为“在哪里干的集合”,上面就是一个切入点,具体到HelloService.sayHello()就是一个连接点。

  3. 通知(Advice):在连接点上执行的行为,通知提供了在AOP中需要在切入点所选择的连接点处进行扩展现有行为的手段;包括前置通知(before advice)、后置通知(after advice)、环绕通知(around advice),在Spring中通过代理模式实现AOP,并通过拦截器模式以环绕连接点的拦截器链织入通知;在AOP中表示为“干什么”;

  4. 方面/切面(Aspect):横切关注点的模块化,比如上边提到的日志组件。可以认为是通知、引入和切入点的组合;在Spring中可以使用Schema和@AspectJ方式进行组织实现;在AOP中表示为“在哪干和干什么集合”;

  5. 引入(inter-type declaration):也称为内部类型声明,为已有的类添加额外新的字段或方法,Spring允许引入新的接口(必须对应一个实现)到所有被代理对象(目标对象), 在AOP中表示为“干什么(引入什么)”;

  6. 目标对象(Target Object):需要被织入横切关注点的对象,即该对象是切入点选择的对象,需要被通知的对象,从而也可称为“被通知对象”;由于Spring AOP 通过代理模式实现,从而这个对象永远是被代理对象,在AOP中表示为“对谁干”;

  7. AOP代理(AOP Proxy):AOP框架使用代理模式创建的对象,从而实现在连接点处插入通知(即应用切面),就是通过代理来对目标对象应用切面。在Spring中,AOP代理可以用JDK动态代理或CGLIB代理实现,而通过拦截器模型应用切面。

  8. 织入(Weaving):织入是一个过程,是将切面应用到目标对象从而创建出AOP代理对象的过程,织入可以在编译期、类装载期、运行期进行。

意义和举个栗子

我写代码,尤其添加,修改和删除等重要操作的时候,特别喜欢加日志,比如当我保存一只猫的时候:

public int saveCat(Cat cat){
  int result = dao.save(cat);
  logger.info("save Cat;cat = {}, result = {}", cat, result);
  return result;
}

当我更新一只猫/删除一只猫的时候,也是如此:

public int updateCat(Cat cat){
  int result = dao.update(cat);
  logger.info("updateCat;cat = {}, result = {}", cat, result);
  return result;
}

public int deleteCat(Cat cat){
  int result = dao.delete(cat);
  logger.info("deleteCat;cat = {}, result = {}", cat, result);
  return result;
}

如果只有一只动物那还好,要是我家是开动物园的,鸡鸭鹅都有,那我不是每次都要加重复的日志,岂不是很奔溃。这个日志和业务本身关系不大,但是又比较重要,所以不能去掉。那有什么方法是可以正常打出日志,但是不会在业务本身显式调用的呢?利用aop可以解决这个问题,在每次方法执行完以后,在比这个方法更上一层的地方(代理类),输出这个方法的参数和返回值的日志即可。

  • 代理与AOP

我的理解是AOP可以通过代理来实现的,但是代理不是唯一实现AOP的方式。比如像aspectj,它完全把切面织入到了目标对象,而不是通过再搞一个代理类来实现的。

相关文章

  • Spring学习系列--3.AOP

    Spring Aop Aop面向切面编程 Aop入门动态代理 动态代理,其实与Aop的原理有些相似,可以用动态代理...

  • 3.3AOP简介-第3章aop面向切面编程

    AOP:面向切面编程,底层采用动态代理实现的,采用了两种代理:jdk的动态代理与CGLIB的动态代理。AOP是动态...

  • 2018-03-21

    与AspectJ的静态代理不同,Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改字节码...

  • spring aop 汇总

    静态代理、动态代理和cglib代理 aop 使用 Spring AOP - 注解方式使用介绍spring aop ...

  • spring(3)动态代理事务操作与AOP

    6. AOP 6.1什么是AOP编程? 6.2 实现方式: 6.3 装饰者模式与静态代理对比: 6.4 动态代理...

  • AOP代理:

    AOP代理:AOP框架创建的对象,代理就是对目标对象的增强。Spring中的AOP代理可以是JDK动态代理,也可以...

  • 代理与AOP

    代理 之前我们讲nginx的时候说过,代理是指存在于我们与操作目标之间的一个东西,我们可以自己去操作目标,也可以通...

  • Spring之代理模式

    九、代理模式 目录:静态代理、动态代理AOP的底层机制就是动态代理。代理模式分为静态代理和动态代理。接触aop之前...

  • java动态代理

    目录: 简介 jdk动态代理 cglib动态代理 jdk动态代理与cglib的区别 应用spring的aop 简介...

  • # 源码解析:AOP(2)

    接上篇# 源码解析:AOP cglib类代理 使用cglib实现的代理与jdk代理类似,只是代理对象的构造方式不同...

网友评论

      本文标题:代理与AOP

      本文链接:https://www.haomeiwen.com/subject/oxnwmftx.html