zoukankan      html  css  js  c++  java
  • Spring之AOP

    AOP的概念
    1:理解AOP是什么
        * AOP Aspect-oriented programming   面向切面(方面)的编程
        * AOP的实现可以对业务逻辑和系统级的服务进行隔离,使业务逻辑跟各系统服务之间的耦合度降低
            提高程序的重用性和开发效率。
          业务逻辑:某个类的某个方法要实现的功能
          系统级服务:系统日志,事务 ,安全性验证
     
    2:怎么实现AOP     
        * AOP实现的原理都是通过动态代理来实现的
        详见:DynamicProxyTest.java
        注意:有两种实现方式 jdk的动态代理和cglib动态代理
            jdk的动态代理机制只能代理实现了接口的类(基于接口编程)
            cglib的动态代理可以代理没有实现接口的类,也可以代理实现了接口的类
     
    3:AOP的一些专业术语       
      * 切面(Aspect) 就是交叉在各个业务逻辑中的系统服务 ,类似于 安全验证,事务处理,日志记录
      * 织入(weaving) 就是讲切面的实现插入到目标方法的过程
      * 连接点(JoinPoint) 就是理论上可以被切面织入的方法 比如StudentServiceImpl类里面的所有方法
      * 切入点(PointCut) 就是实际上被切面织入的方法  比如事务控制 add update del
      * 目标对象(target) 就是包含了被切面织入的方法  的类 ---StudentServiceImpl
      * 通知(Adivce) 就是切面的实现
      * 顾问(Advisor) 其实就是通知的一个封装和延伸 可以将通知以更复杂的方式织入到某些方法中
     
    4:  spring的AOP实现
        4.1 引入两个jar包
            *  spring-aop-4.2.1.RELEASE.jar
            * aopalliance-1.0.jar
     
        4.2 各种通知(前置通知,后置通知,环绕通知,异常通知) 的代码
    MethodBeforeAdvice    spring前置通知需要实现的接口 
    AfterReturningAdvice  spring后置通知需要实现的接口 
    MethodInterceptor     spring环绕通知需要实现的接口 

      

        4.3 配置通知 和应用通知
            * 配置目标对象类
            * 配置通知
            * 配置代理生成器
    ProxyFactoryBean
     
        4.4 通知注意点   
            * 在代理类生成器的配置里面 ,关于接口的属性默认可以不用 <property name = "interfaces values">
            * 因为后置通知是在目标方法执行之后才执行,他可以得到目标方法的返回值,但是不能更改它的返回值
            * 环绕通知既有在目标方法执行前的代码,也有在目标方法执行后的代码,他不仅可以得到目标方法的返回值
                而且可以改变他
        详见代码:com.tz.springstudy.sysmanage.advice.*
                applicationContext.xml
                AdviceTest.java   
     
        4.5 顾问(advisor)    它将通知进行了包装, 将切面织入到指定的某些方法当中   
            PointcutAdvisor是顾问的一种,它有两种实现方式
            * 名称匹配方法切入点顾问
                NameMatchMethodPointcutAdvisor
            * 正则表达式匹配方法切入点顾问
                RegexpMethodPointcutAdvisor
                a: *  匹配前面的表达式任意次  比如 ab* 能匹配ab abb abbb abbbbbb
                b: .  匹配任意单个字符 除了 " " 之外
                .* 代表任意字符串 
            详见代码:applicationContext.xml
                    AdvisorTest.java   
     
        顾问解决了某些方法的问题,自动代理了生成器解决了某些类的问题
        我们一直在努力将某些切面织入到某些类的某些方法里面去           
     
     
     
  • 相关阅读:
    vue中用解构赋值的方法引入组件
    es6--promise
    VUE设置浏览器icon图标
    vue项目之购物车
    vue之组件通信
    hbulider 快捷键
    Redis详解(3)--5大数据类型
    Redis详解(1)--redis简介与安装
    Redis详解(2)--redis配置文件介绍
    Python面试综合--web相关
  • 原文地址:https://www.cnblogs.com/lhl-shubiao/p/6685982.html
Copyright © 2011-2022 走看看