Spring的AOP

代理模式【结构型模式】:

  • 作用,什么时候使用:

    1. 当一个对象需要保护的时候【保护对象】;
    2. 需要给对象的功能增强;
    3. 对象之间无法直接交互的时候;
  • 角色【使用着无法察觉代理过程】:

    • 目标对象;
    • 代理对象;
    • 目标对象和代理对象的公共接口【共同点】;
  • 静态代理:

    • 统计方法解决办法:

      1. 直接修改源代码,设计统计时间【违背OCP】;

      2. 使用子类继承,统计时间【子类和父类,耦合度高】;

        类与类的关系:

        • 泛化【is a】和关联【has a】关系
      3. 静态代理模式;

        • 通过公共接口传递对象【降低耦合度】;
        • 静态代理,一个对对象对应一个代理对象【类膨胀,不好维护】;
  • 动态代理:

    • 动态的生成技术:在内存中动态生成代理类【运行阶段】;
    • JDK动态代理类【基于接口代理】;
    • CGLIB动态代理【基于继承代理,可以代理接口和类,不能代理final类,原理和继承的一致】;
    • javassist动态代理;
  • JDK基于接口的动态代理;

    OrderSerice proxyObj = (OrderSerice)Proxy.newProxyInstance(orderSericeImpl.getClass().getClassLoader(),           orderSericeImpl.getClass().getInterfaces(),
                    new TimerInvocationHandler());
    
    • 参数1:代理对象的类加载器,在内存中生成的class文件,也要又类加载器进行加载到jvm中;
    • 参数2:代理对象和代理共有的接口;
    • 参数3:调用处理器接口实例化对象【实现增强的代码逻辑,结构】,仅当代理调用代理方法的时候,会在底层调用invoke方法;
  • 基于CGlib的代理,功能更强;

    • 类的class对象,方法拦截接口的实现实例化,创建代理对象
    Enhancer enhancer = new Enhancer();
    enhancer.setSuperclass(OrderSericeImpl.class);
    enhancer.setCallback(new TimerMethodInterceptor());
    OrderSericeImpl cjlibProxy =(OrderSericeImpl)enhancer.create();
    cjlibProxy.detail();
    
  • AOP,面向切面编程【编程思想,编程技术 】;

    • 固定不变的,和业务逻辑无关的交叉业务

    • 竖向业务核心,横向是交叉业务【日志,安全,事务等】;

    • 将交叉业务提取出来,形成横向的切面;

    • AOP思想:将与核心业务模块无关的代码独立抽取出来,形成一个组件,然后以横向的方法应用到业务流程中去;

      • 代码复用强;
      • 可维护;
      • 更好的关注业务逻辑;
    • Spring中的AOP是使用动态代理:JDK和CGLIB动态代理技术,如果是使用接口代理,默认使用JDK,如果类没有实现接口则会切换为CGLIB:

    • AOP术语:

      • 连接点【JoinPoint】:可能织入切面的位置【位置】;

      • 切点【PointCut】:类中真正织入的方法【方法】;

      • 通知【Advice】:通知又叫增强,是具体增强的代码【代码】;

        • 根据增强放在连接点的位置有:前置,后置,环绕,异常,最终
      • 切面:切点 + 通知就是切面【等效实现处理器接口对象】;

      • 织入:把通知应用到目标对象上的过程【动作】;

      • 代理对象;

      • 目标对象;

      • 切点表达式:匹配切点;

        execution([访问修饰符]返回值类型[全限定类名]方法名(形式参数列表)[异常])
        
        • 返回值类型:*,返回任意类型;
        • 全限定类名:..,代表当前包及其子包下所有类,省略时,所有类;
        • 方法名:*,所有方法,set*,表示所有set方法;
        • 参数方法:..,参数类型和个数任意,*只有一个参数方法,(*,String),第一个参数随意;
  • Spring的AOP实现:

    • Spring + AspectJ:基于注解,
      • 切面顺序:@Order(number),数字越小,优先级越高;
    • Spring + AspectJ:基于xml;
    • Spring自己实现AOP,基于xml配置【舍】;
    • 事务:注解式,和声明式;
    • 安全日志;
  • Spring的事务,在AOP的基础上再进行封装【二次封装】;

    • 编程式事务;
    • 声明式事务
      • 基于注解
      • 基于xml配置;
      • 事务的属性:
        • Propagation:传播特性【两个方法的事务】
          • Requiered:有就加入,没有就新建事务【默认】;
          • Supportts:有就加入,没有就不管了;
          • Mandatory:有就加入,没有就抛异常;
          • Requied_new:不管有没有,开启新事务【不存在嵌套关系,独立】;
          • Not_supported:不支持事务,已有的,挂起;
          • Never:不支持事务,有就抛异常;
          • Nested:有事务就嵌套,没有就新建;
        • 事务的关系【串行关系】,决定了事务的回滚和提交;
        • 事务的隔离【并行关系】,决定事务的并发关系;
          • 脏读【读到未提交事务中的数据】,可不重复读【在同一个事务中,每次读的数据不一样【数据修改】】,幻读【同一个事务中,每次读取的数据量不一样】
        • 事务超时【秒为单位】:
          • 超过时间后,事务中的DML语句没有执行完毕的话,会执行回滚。
            • 时间是:到最后一条DML语句执行之后的时间。
            • 最后一条DML语句后的业务逻辑,不算有效时间;
        • 只读事务:【没有增删改,只有slect】;
          • 启动spring的优化策略,提高select的执行效率;
        • 设置选择性异常回滚;
posted @ 2025-06-03 20:11  烟雨断桥  阅读(16)  评论(0)    收藏  举报