JAVA AOP

来源:互联网 发布:win10网络图标红叉 编辑:程序博客网 时间:2024/06/03 15:26

Spring AOP 学习

  • AOP描述
    • aop 是一种编程范式(编程范式:面向过程,面向对象,面向函数,面向事件,面向切面。。。)
    • 不拘于编程语言
  • spring AOP
    • 切入点匹配方式(Pointcut expression)
      • 指示器(designators)
        //修饰符正则 返回值 包名 方法名 异常
        • 匹配方法(execution(modifer-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern? ))
        • 匹配注解 (@target(),@args(),@within(),@annotation())
        • 匹配包/类型 (within())
        • 匹配对象(this(),bean(),target())
        • 匹配参数(args())
      • 通配符(wildcards)
        • *(代表所有)
        • +(指定类及其子类(遗传))
        • ..(任意 参数 ,包)
      • 运算符(operators)
        • && 与
        • || 或
        • ! 非
    • advice 注解
      • @Before 前置通知
      • @After 后置通知
      • @AfterReturning 成功后返回通知
      • @AfterReturning(value=”pointcut(切入点)”,returning=”return result(返回值)”)
      • @AfterThrowing 异常通知
      • @Around 环绕通知
        • 带有该注解的方法必须返回Object 并接受 ProceedingJoinPoint 参数,调用该参数的proceed
  • spring AOP 原理(动态代理模式)代理原方法 在之前,之后,异常 嵌入切入点
    • 动态代理的实现(用字节码技术动态生成class文件)
    • java jdk (只能基于接口)
    • AOP代理类实现 InvocationHandler 接口 重写 invoke(Object proxy, Method method, Object[] args) 方法
      //返回实现类对象 类加载器 被代理类的接口 接口的实现类
  • 调用方通过 Proxy.newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h) 获取代理类对象
  • 被代理对象执行主方法
  • cglib (基于类继承,但不能代理静态(static)方法 与 私有方法)
  • AOP代理类实现 MethodInterceptor 接口 重写 intercept(Object obj, Method method, Object[] objs, MethodProxy proxy)方法
  • 调用方通过 创建 Enhancer 对象 setSuperclass(被代理的超类) setCallback(目标实现类) 创建代理对象 create()
  • 被代理对象执行主方法
  • 多AOP 实现 (责任链模式)
    List<超类> list ;
    int index = 0;调用索引
    //强引用
    public Chian(List<ChainHandler> list) { this.list = list; }
    //执行
    public void exec() {
    if(list == null || index >= list.size()) {
    return;
    }
    //目标执行处理
    list.get(index++).process(this);
    }

    · 需要的超类
    //目标方法
    abstract void handlerProcess() ;
    //调用处理
    public void process(Chian chian) {
    //调用目标方法
    handlerProcess();
    //调用下一个
    chian.exec();
    }

原创粉丝点击