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: 

 找不到,注意要指到类

原文地址:https://www.cnblogs.com/obge/p/14649329.html