一:SpringAOP概念

  面向切面编程(Aspect Oriented Programming)提高了另一种角度来思考程序的结构,通过预编译方式和运行期间的动态代理实现程序功能的统一维护的一种技术。它用这种结构方式来弥补了面向对象编程(Object Oriented Programming)的不足。除此以外,AOP还提供了切面,对关注点进行模块化,使用模块化对业务逻辑的各个部分隔离,从而使得各部分业务逻辑直接的耦合度降低,提高程序的可重用性。Spring AOP是是Spring的重要组件之一,但是Spring IOC并不依赖Spring AOP,这意味着我们可以自由选择是否使用AOP,AOP还提供了强大的中间件解决方案,这使得Spring IOC更加完善了,我们可以通过AOP完成对事务管理、权限控制、日志监听等。

1:Spring AOP介绍

①:切面(Aspect):
  一个关注点的模块化,这个关注点可能会横切多个对象。事务管理就是一个关于横切关注点很好的例子,在Spring中我们可以通过XML或者注解
  来实现对程序的切面。
②:连接点(Join point):
  程序执行过程中的某个特定的点,比如某个方法被调用的时候或者处理异常的时候。在Spring AOP中一个连接点总是代表一个方法的执行,其实
  AOP拦截的方法就是一个连接点。
③:通知(Advice):
  在切面的某个连接点上执行的动作,通知类型包括“before”、“after”、“around”等。许多AOP框架都是以拦截器作为通知的模型,并维护一个
  以连接点为中心的拦截器链,Spring也不例外。总之就是AOP对拦截点的处理通过通知来执行,所以说通知是指一个方法被AOP拦截到的时候要执
  行的代码。
④:切入点(Pointcut):
  匹配连接点的断言。通知和切入点表达式关联,并与切入点匹配的任何连接点上运行。切入点表达式如何跟连接点匹配是AOP的核心,Spring默认
  使用Aspectj作为切入点语法。说白了就是切面指定一个方法被AOP拦截到的时候要执行的代码。
⑤:引入(Introduction):
  声明额外的方法和字段。Spring AOP允许你向任何被通知对象引入一个新的接口(及其实现类)。说白了就是AOP允许在运行的时候动态的向
  代理对象实现新的接口来完成一些额外的功能,并不影响现有的对象功能
⑥:目标对象(Target Object):
  被一个或多个切面所通知的对象,也称作被通知对象。由于Spring AOP是通过运行时代理实现的,所以这个对象永远时被代理对象。说白了就是
  所以的对象在AOP中都会产生一个代理类,AOP整个过程都是针对代理类进行处理
⑦:AOP代理(AOP proxy):
  AOP框架创建的对象,用来实现切面(包括通知方法执行等功能),在Spring中AOP可以是JDK动态代理或Cglib代理。
⑧:织入(Weaving):
  把切面连接到其它应用程序类型或者对象上,并创建一个被通知对象。这些可以在编译时(例如使用AspectJ编译器),类加载时和运行时完成,
  Spring和其它纯AOP框架一样,在运行时完成织入,说白了就是把切面跟对象关联并创建该对象的代理对象的过程。

补充:通知(Advice)的类型:
①:前置通知(Before advice):
    在某个连接点(Join point)之前执行的通知,但这个通知不能阻止连接点的执行(除非它抛出一个异常)。
②:返回后通知(After returning advice):
    在某个连接点(Join point)正常完成后执行的通知。例如,一个方法没有抛出任何异常正常返回。
③:抛出异常后通知(After throwing advice):
    在方法抛出异常后执行的通知。
④:后置通知(After(finally)advice):
    当某个连接点(Join point)退出的时候执行的通知(不论是正常返回还是发生异常退出)。
⑤:环绕通知(Around advice):
    包围一个连接点(Join point)的通知,如方法调用。这是最强大的一种通知类型。环绕通知可以在方法前后完成自定义的行为。
    它也会选择是否继续执行连接点或直接返回它们自己的返回值或抛出异常来结束执行。

 二:简单案例引入AOP概念及手动解决(了解

1:转账问题代码

本案例我使用注解加xml两种方式的结合来完成案例的展示及问题所在  数据库建表语句

Spring AOP概念及作用
<dependencies>
        <!--mysql驱动坐标-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.32</version>
        </dependency>

        <!--c3p0连接池坐标-->
        <dependency>
            <groupId>c3p0</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.1.2</version>
        </dependency>

        <!--dbutils工具类坐标-->
        <dependency>
            <groupId>commons-dbutils</groupId>
            <artifactId>commons-dbutils</artifactId>
            <version>1.7</version>
        </dependency>

        <!--junit单元测试坐标-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

        <!--Spring-context主要坐标-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.6.RELEASE</version>
        </dependency>

        <!--Spring-test测试坐标-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.2.6.RELEASE</version>
        </dependency>

        <!--annotation坐标-->
        <dependency>
            <groupId>javax.annotation</groupId>
            <artifactId>javax.annotation-api</artifactId>
            <version>1.3.2</version>
        </dependency>
    </dependencies>
pom.xml

相关文章:

  • 2021-11-28
  • 2021-03-31
  • 2022-12-23
  • 2022-12-23
  • 2021-08-14
  • 2021-07-20
  • 2022-02-14
猜你喜欢
  • 2021-09-10
  • 2021-09-22
  • 2022-12-23
  • 2021-07-16
  • 2021-07-30
  • 2022-12-23
  • 2021-04-24
相关资源
相似解决方案