zoukankan      html  css  js  c++  java
  • Spring_AOP

    一、代理模式

      1、代理模式的设计原则:

        ·代理类与委托类具有相似的行为

        ·代理类增强委托类的行为

      

      2、代理模式实现的三要素:

        代理角色、目标角色、共同行为

        实现行为接口,持有目标对象的引用

      3、静态代理和动态代理

        1)静态代理

          特点:程序运行前制作代理角色

             代理目标角色单一

             代理类数量无法控制

        2)动态代理

          程序运行期动态创建代理角色

          ·JDK动态代理,回调方式实现

          ·cglib动态代理,继承方式实现

         区别:

            JDK动态代理:委托类必须要有接口,制作过程较快,执行慢

            Cglib动态代理:委托类可以没有接口,继承的思维来实现相似性,制作代理过程比较慢,执行快

    二、AOP(面相切面编程)

      AOP的两种实现机制是JDK动态代理和cglib动态代理

        AOP主要应用于日志记录,性能统计,安全控制,事务处理额等方面,实现公共行为的重复使用

        降低模块之间的耦合度,提高业务代码的聚合度(高内聚低耦合)

        提高代码的复用性

        提高系统的扩展性

      Aop基本概念

        Joinpoint(连接点):spring中指被拦截到的每一个方法

        Pointcut(切入点):规定拦截哪些方法,对那些方法进行处理

        Advice(通知):拦截到每一个连接点后要做的操作

          前置通知、返回通知、最终通知、异常通知、环绕通知

        Aspect(切面):切入点与通知的结合

        Target(目标对象):被代理的目标对象

        Weave(织入)

        Introduction(引入)

    三、AOP注解实现

      1、XML:引入命名空间,开启aop代理环境

        

      2、Maven项目引入Aspect坐标

      3、创建切面类  @Aspect定义切面类

      4、声明方法为切入点  @Pointcut 匹配规则定义 execution

      5、创建通知方法

        

    package com.shsxt02.proxy;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.*;
    import org.springframework.stereotype.Component;
    
    @Aspect
    @Component
    public class LogCut {
    
        @Pointcut("execution(* com.shsxt02.service..*.*(..))")
        public void cut() {
        }
    
        @After(value = "cut()")
        public void before(){
            System.out.println("前置通知,目标方法执行前执行...");
        }
    
        @AfterReturning(value = "cut()")
        public void afterReturn(){
            System.out.println("返回通知,方法正常结束后执行...");
        }
    
        @After(value = "cut()")
        public void after(){
            System.out.println("最终通知,方法是否发生异常均会执行...");
        }
    
        @AfterThrowing(value = "cut()",throwing = "e")
        public void afterThrow(Exception e){
            System.out.println("异常通知,异常时执行..."+e);
        }
    
        // 环绕通知
        @Around(value = "cut()")
        public Object around(ProceedingJoinPoint  pjp) throws Throwable {
            Object result=null;
            System.out.println("环绕前置...");
            System.out.println("环绕通知...");
            System.out.println("方法签名"+pjp.getSignature());
            System.out.println("目标对象"+pjp.getTarget());
            System.out.println("种类"+pjp.getKind());
            Object[] objects=pjp.getArgs();
            for(Object o:objects){
                System.out.println("参数"+o);
            }
            result= pjp.proceed(); // 返回的目标对象
            System.out.println("环绕后置...");
            return result;
        }
    }

    四、AOP XML配置实现

      

    五、AOP拦截注释

      

    如果目标角色实现了接口,AOP有代理,返回的是代理对象,需要通过接口接收。

  • 相关阅读:
    PTA 两个有序链表序列的合并
    PTA 递增的整数序列链表的插入
    PTA 链表逆置
    PTA 带头结点的链式表操作集
    _KPCR, _NT_TIB, _KPRCB
    FSOP
    逆向PspCreateProcess
    寒假训练 [GKCTF2020]Domo(4/250) 劫持vtable
    IO_FILE利用与劫持vtables控制程序流程、FSOP
    线程结构
  • 原文地址:https://www.cnblogs.com/dhome/p/9716234.html
Copyright © 2011-2022 走看看