zoukankan      html  css  js  c++  java
  • Java 框架 ------- spring AOP(简单了解与常见小错误)

    AOP 的全称是“Aspect Oriented Programming”,即面向切面编程,它将业务逻辑的各个部分进行隔离,使开发人员在编写业务逻辑时可以专心于核心业务,从而提高了开发效率。

    面向切面编程(AOP)和面向对象编程(OOP)类似,也是一种编程模式。

    AOP 采取横向抽取机制,取代了传统纵向继承体系的重复性代码,其应用主要体现在事务处理、日志管理、权限控制、异常处理等方面。

    目前最流行的 AOP 框架有两个,分别为 Spring AOP 和 AspectJ。

    • Spring AOP 使用纯 Java 实现,不需要专门的编译过程和类加载器,在运行期间通过代理方式向目标类植入增强的代码。
    • AspectJ 是一个基于 Java 语言的 AOP 框架,从 Spring 2.0 开始,Spring AOP 引入了对 AspectJ 的支持。AspectJ 扩展了 Java 语言,提供了一个专门的编译器,在编译时提供横向代码的植入。

    Spring AOP 是基于 AOP 编程模式的一个框架,它的使用有效减少了系统间的重复代码,达到了模块间的松耦合目的。

    在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能。周边功能在Spring的面向切面编程AOP思想里,被定义为切面,

    • 核心业务,比如登陆,增加数据,删除数据都叫核心业务
    • 周边功能,比如性能统计,日志,事务管理等等

    核心业务功能和切面功能分别独立进行开发,然后把切面功能和核心业务功能 "编织" 在一起,

    //常见术语
    Joinpoint(连接点) 指那些被拦截到的点,在 Spring 中,可以被动态代理拦截目标类的方法。 Pointcut(切入点) 指要对哪些 Joinpoint 进行拦截,即被拦截的连接点。 Advice(通知) 指拦截到 Joinpoint 之后要做的事情,即对切入点增强的内容。 Target(目标) 指代理的目标对象。 Weaving(植入) 指把增强代码应用到目标上,生成代理对象的过程。 Proxy(代理) 指生成的代理对象。 Aspect(切面) 切入点和通知的结合。

    一、简单小项目

    1、业务类

    2、日志类

    JointPoint是程序运行过程中可识别的点,这个点可以用来作为AOP切入点。JointPoint对象则包含了和切入相关的很多信息。比如切入点的对象,方法,属性等。我们可以通过反射的方式获取这些点的状态和信息,用于追踪tracing和记录logging应用信息。

    pointcut 是一种程序结构和规则,它用于选取join point并收集这些point的上下文信息。
    pointcut通常包含了一系列的Joint Point,我们可以通过pointcut来同时操作jointpoint。单从概念上,可以把Pointcut当做jointpoint的集合。

     

       java.lang.Object[] getArgs():获取连接点方法运行时的入参列表; 
       Signature getSignature() :获取连接点的方法签名对象; 
       java.lang.Object getTarget() :获取连接点所在的目标对象; 
       java.lang.Object getThis() :获取代理对象本身; 

    3、applicationContext.xml

    aop 在 xml 中的相关配置

        <aop:config>
            <aop:aspect ref="myAspect">
                <!-- 配置切入点,通知最后增强哪些方法 -->
                <aop:pointcut expression="execution ( * com.mengma.dao.*.* (..))"
                    id="myPointCut" />
                <!--前置通知,关联通知 Advice和切入点PointCut -->
                <aop:before method="myBefore" pointeut-ref="myPointCut" />
                <!--后置通知,在方法返回之后执行,就可以获得返回值returning 属性 -->
                <aop:after-returning method="myAfterReturning"
                    pointcut-ref="myPointCut" returning="returnVal" />
                <!--环绕通知 -->
                <aop:around method="myAround" pointcut-ref="myPointCut" />
                <!--抛出通知:用于处理程序发生异常,可以接收当前方法产生的异常 -->
                <!-- *注意:如果程序没有异常,则不会执行增强 -->
                <!-- * throwing属性:用于设置通知第二个参数的名称,类型Throwable -->
                <aop:after-throwing method="myAfterThrowing"
                    pointcut-ref="myPointCut" throwing="e" />
                <!--最终通知:无论程序发生任何事情,都将执行 -->
                <aop:after method="myAfter" pointcut-ref="myPointCut" />
            </aop:aspect>
        </aop:config>

    我们需要用到的如下

    4、测试

    二、注意报错:

    1、发现了以某某开头的无效内容

     调整aop:pointcut  与 aop:aspect 的位置

    2、java.lang.IllegalArgumentException: Pointcut is not well-formed: expecting 'name pattern' at character position 46

    分开后就好了

     3、 java.lang.IllegalArgumentException: 

     找不到,注意要指到类

  • 相关阅读:
    感谢那些给予我无偿帮助的人!
    软件工程总结
    《暗时间》部分感想!
    四个数混合运算,数据库存题,程序集构建三层建构
    三个数混合运算和三层架构
    需求
    数据库实现,以及工厂方法模式实现
    WPF中实现
    git简单操作
    git操作??
  • 原文地址:https://www.cnblogs.com/obge/p/14649329.html
Copyright © 2011-2022 走看看