spring使用AOP技术对DAO层操作进行增强功能

2023-11-01

AOP的概述

1. 什么是AOP的技术?
    * 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程
    * AOP是一种编程范式,隶属于软工范畴,指导开发者如何组织程序结构
    * AOP最早由AOP联盟的组织提出的,制定了一套规范.Spring将AOP思想引入到框架中,必须遵守AOP联盟的规范
    * 通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术
    * AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型
    * 利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率

2. AOP:面向切面编程.(思想.---解决OOP遇到一些问题)
3. AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码(性能监视、事务管理、安全检查、缓存)

4. 为什么要学习AOP
    * 可以在不修改源代码的前提下,对程序进行增强!!   

Spring框架的AOP的底层实现

1. Srping框架的AOP技术底层也是采用的代理技术,代理的方式提供了两种
    1. 基于JDK的动态代理
        * 必须是面向接口的,只有实现了具体接口的类才能生成代理对象

    2. 基于CGLIB动态代理
        * 对于没有实现了接口的类,也可以产生代理,产生这个类的子类的方式

2. Spring的传统AOP中根据类是否实现接口,来采用不同的代理方式
    1. 如果实现类接口,使用JDK动态代理完成AOP
    2. 如果没有实现接口,采用CGLIB动态代理完成AOP

JDK的动态代理(代码了解,理解原理)

1. 使用Proxy类来生成代理对象的一些代码如下:
    /**
     * 使用JDK的方式生成代理对象
     * @author Administrator
     */
    public class MyProxyUtils {
        public static UserDao getProxy(final UserDao dao) {
            // 使用Proxy类生成代理对象
            UserDao proxy = (UserDao) Proxy.newProxyInstance(dao.getClass().getClassLoader(),
                    dao.getClass().getInterfaces(), new InvocationHandler() {

                        // 代理对象方法一直线,invoke方法就会执行一次
                        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                            if("save".equals(method.getName())){
                                System.out.println("记录日志...");
                                // 开启事务
                            }
                            // 提交事务
                            // 让dao类的save或者update方法正常的执行下去
                            return method.invoke(dao, args);
                        }
                    });
            // 返回代理对象
            return proxy;
        }
    }

CGLIB的代理技术(代码了解)

1. 引入CBLIB的开发包
    * 如果想使用CGLIB的技术来生成代理对象,那么需要引入CGLIB的开发的jar包,在Spring框架核心包中已经引入了CGLIB的开发包了。所以直接引入Spring核心开发包即可!

2. 编写相关的代码
    public static OrderDaoImpl getProxy(){
        // 创建CGLIB核心的类
        Enhancer enhancer = new Enhancer();
        // 设置父类
        enhancer.setSuperclass(OrderDaoImpl.class);
        // 设置回调函数
        enhancer.setCallback(new MethodInterceptor() {
            @Override
            public Object intercept(Object obj, Method method, Object[] args,
                    MethodProxy methodProxy) throws Throwable {
                if("save".equals(method.getName())){
                    // 记录日志
                    System.out.println("记录日志了...");
                }
                return methodProxy.invokeSuper(obj, args);
            }
        });
        // 生成代理对象
        OrderDaoImpl proxy = (OrderDaoImpl) enhancer.create();
        return proxy;
    }

Spring基于AspectJ的AOP的开发


AOP的相关术语

1. Joinpoint(连接点)   -- 所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点
2. Pointcut(切入点)        -- 所谓切入点是指我们要对哪些Joinpoint进行拦截的定义
3. Advice(通知/增强)    -- 所谓通知是指拦截到Joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)
4. Introduction(引介) -- 引介是一种特殊的通知在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field
5. Target(目标对象)     -- 代理的目标对象
6. Weaving(织入)      -- 是指把增强应用到目标对象来创建新的代理对象的过程
7. Proxy(代理)        -- 一个类被AOP织入增强后,就产生一个结果代理类
8. Aspect(切面)           -- 是切入点和通知的结合,以后咱们自己来编写和配置的

AspectJ的XML方式完成AOP的开发

1. 步骤一:创建JavaWEB项目,引入具体的开发的jar包
    * 先引入Spring框架开发的基本开发包
    * 再引入Spring框架的AOP的开发包
        * spring的传统AOP的开发的包
            * spring-aop-4.2.4.RELEASE.jar
            * com.springsource.org.aopalliance-1.0.0.jar

        * aspectJ的开发包
            * com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
            * spring-aspects-4.2.4.RELEASE.jar

2. 步骤二:创建Spring的配置文件,引入具体的AOP的schema约束
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

3. 步骤三:创建包结构,编写具体的接口和实现类
    * com.itheima.demo2
        * CustomerDao           -- 接口
        * CustomerDaoImpl       -- 实现类

4. 步骤四:将目标类配置到Spring中
    <bean id="customerDao" class="com.itheima.demo3.CustomerDaoImpl"/>

5. 步骤五:定义切面类
    public class MyAspectXml {
        // 定义通知
        public void log(){
            System.out.println("记录日志...");
        }
    }

6. 步骤六:在配置文件中定义切面类
    <bean id="myAspectXml" class="com.itheima.demo3.MyAspectXml"/>

7. 步骤七:在配置文件中完成aop的配置
    <aop:config>
        <!-- 引入切面类 -->
        <aop:aspect ref="myAspectXml">
            <!-- 定义通知类型:切面类的方法和切入点的表达式 -->
            <aop:before method="log" pointcut="execution(public * com.demo3.CustomerDaoImpl.save(..))"/>
        </aop:aspect>
    </aop:config>

8. 完成测试
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("classpath:applicationContext.xml")
    public class Demo3 {
        @Resource(name="customerDao")
        private CustomerDao customerDao;
        @Test
        public void run1(){
            customerDao.save();
            customerDao.update();
            customerDao.delete();
        }
    }

切入点的表达式

1. 再配置切入点的时候,需要定义表达式,重点的格式如下:execution(public * *(..)),具体展开如下:
    * 切入点表达式的格式如下:
        * execution([修饰符] 返回值类型 包名.类名.方法名(参数))

    * 修饰符可以省略不写,不是必须要出现的。
    * 返回值类型是不能省略不写的,根据你的方法来编写返回值。可以使用 * 代替。
    * 包名例如:com.itheima.demo3.BookDaoImpl
        * 首先com是不能省略不写的,但是可以使用 * 代替
        * 中间的包名可以使用 * 号代替
        * 如果想省略中间的包名可以使用 .. 

    * 类名也可以使用 * 号代替,也有类似的写法:*DaoImpl
    * 方法也可以使用 * 号代替
    * 参数如果是一个参数可以使用 * 号代替,如果想代表任意参数使用 ..

AOP的通知类型

1. 前置通知
    * 在目标类的方法执行之前执行。
    * 配置文件信息:<aop:after method="before" pointcut-ref="myPointcut3"/>
    * 应用:可以对方法的参数来做校验

2. 最终通知
    * 在目标类的方法执行之后执行,如果程序出现了异常,最终通知也会执行。
    * 在配置文件中编写具体的配置:<aop:after method="after" pointcut-ref="myPointcut3"/>
    * 应用:例如像释放资源

3. 后置通知
    * 方法正常执行后的通知。       
    * 在配置文件中编写具体的配置:<aop:after-returning method="afterReturning" pointcut-ref="myPointcut2"/>
    * 应用:可以修改方法的返回值

4. 异常抛出通知
    * 在抛出异常后通知
    * 在配置文件中编写具体的配置:<aop:after-throwing method="afterThorwing" pointcut-ref="myPointcut3"/> 
    * 应用:包装异常的信息
5. 环绕通知
    * 方法的执行前后执行。
    * 在配置文件中编写具体的配置:<aop:around method="around" pointcut-ref="myPointcut2"/>
    * 要注意:目标的方法默认不执行,需要使用ProceedingJoinPoint对来让目标对象的方法执行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

spring使用AOP技术对DAO层操作进行增强功能 的相关文章

随机推荐

  • 51nod-1101 换零钱

    时间限制 1 秒 空间限制 65536 KB 分值 20 N元钱换为零钱 有多少不同的换法 币值包括1 2 5分 1 2 5角 1 2 5 10 20 50 100元 例如 5分钱换为零钱 有以下4种换法 1 5个1分 2 1个2分3个1分
  • FreeRTOS 临界段和开关中断

    以下转载自安富莱电子 http forum armfly com forum php 临界段代码的临界段也称为临界区 一旦这部分代码开始执行 则不允许任何中断打断 为确保临界段代码的执行不被中断 在进入临界段之前须关中断 而临界段代码执行完
  • AIGC来了,品牌方开始要求降价|AI重塑未来营销

    AIGC正在重塑营销领域 为品牌带来新的解决方案 营销可能是最早与AIGC结合并产生实际落地效果的领域之一 然而 需要注意AI工具的局限性和过度精准投放的影响 个性化的营销内容重要 但难以塑造国民级品牌 在AI时代 品牌需要找到自己的最大公
  • pycharm安装教程(安装必看)

    文章目录 软件简介 一 pycharm下载 二 安装 三 使用pycharm 软件简介 PyCharm是一种Python IDE Integrated Development Environment 集成开发环境 带有一整套可以帮助用户在使
  • fstat函数及struct stat结构

    转载地址 点击打开链接 一 fstat 函数 功能 由文件描述符取得文件状态 相关函数 stat lstat chmod chown readlink utime 头文件 include
  • Kettle_js脚本_示例

    Kettle 版本7 0 一 String function 1 date2str js操作时间 var dValue new Date 把时间变成字符串 var dValue1 date2str dValue 把时间变成当前格式字符串 v
  • java-统计一段句子中各单词出现的次数

    问题 统计一段句子中各单词出现的次数 思路 1 使用split方法将文章进行分割 我们这里以空格 逗号和句点为分隔符 然后存到一个字符串数组中 2 创建一个hashMap集合 key是字符串类型 保存单词 value是数字类型 保存该单词出
  • ROS编程Raspberry Pi机器人模型

    使用机器人操作系统 ROS 基础设施将物理机器人连接到机器人模拟是 ROS 工程师面临的最常见挑战之一 您将学习如何在虚拟环境中模拟机器人 并在等效的真实世界场景中实现所需的行为 首先介绍了 Raspberry Pi机器人模型及其配备的传感
  • 新一代免费开源大型企业数智制造解决方案

    国家加速推进信创产业的开源自主可控 信创产业 即信息技术应用创新产业 其包含了从信息化基础设施到底层系统 再到上层的应用软件 与信息化建设过程中涉及有关的全产业链都必须安全与可控 信创产业涉及到的领域包括信息化基础设施 如CPU 服务器 存
  • Axure RP软件安装包分享(附安装教程)

    目录 一 软件简介 二 软件下载 一 软件简介 Axure RP是一款专业的原型设计工具 它能够帮助用户创建高保真度的交互式原型 Axure RP具有以下特点 强大的交互设计功能 Axure RP提供了丰富的交互设计工具 用户可以通过拖拽和
  • Linux-僵尸进程产生与处理

    目录 背景 产生 处理方法 方法一 父进程通过wait或者wait pid方式回收子进程 方法二 信号处理signal 改进版 背景 父进程创建子进程之后 父进程没有等待该子进程的退出 子进程就会成为僵尸进程 如果父进程也退出 这个时候子进
  • F28027第八课---ADC操作解读

    已经有三天没有写了 心里真过意不过 但最近确实真的太忙了 大家见谅 前面那几节课 我们基本上把F28027自身的特性了解了一下 从这节课开始 我们将要学习它的外设 我的目标是周末这两天 要把ADC 温度 比较器 ePWM SPI都了解完 并
  • Bode Plots by Hand 徒手绘制波特图

    https blog csdn net u011368821 article details 26759659
  • USDT/DAPP授权原理/USDT接口实现

    一 安装需求 AAA com bbb com ccc com 需要三个域名 1 安装环境 a 服务器 centos7以上 软件商店 b nginx1 2以上 c php7 3版本 c1 安装php扩展 redis和gmp c2 删除所有ph
  • 接单日记(二)SMTP发送邮件

    文章目录 接单日记 二 SMTP发送邮件 一 实验目的 二 实验内容 三 程序及结果 1 运行程序 2 运行结果 接单日记 二 SMTP发送邮件 此为一个实验报告 故遵守实验报告的格式 一 实验目的 熟悉SMTP发送邮件的原理 使用SMTP
  • Docker基础修炼2--Docker镜像原理及常用命令

    通过前文的讲解对Docker有了基本认识之后 我们开始进入实战操作 本文先演示Docker三要素之镜像原理和相关命令 本文的演示环境仍然沿用上一篇文章在本地Centos7中安装的环境 如果你本地没有搭建Docker环境 也可以直接使用前文提
  • CMake 学习笔记 (Generator Expressions)

    CMake 学习笔记 Generator Expressions Generator Expressions 可以认为是一种特殊的变量 它会在编译阶段求值 通常用在 target link libraries target include
  • 基数排序-------C语言实现

    其他排序 堆排序 归并排序 插入排序和希尔排序 快速排序 冒泡排序和选择排序 基数排序 前备知识 注 我们知道 对于一个数如果我们想获取它得个位 只需对10取余 想获取十位的数 可以除10然后再对10取余 获取百位除100然后再对10取余
  • 网站服务器ip地址在哪里改,网站服务器ip地址在哪里改

    网站服务器ip地址在哪里改 内容精选 换一换 成功访问网站包含以下两个阶段 这两个阶段缺一不可 需要同时成功才能正常访问网站 如图1所示 阶段一 DNS根据访问请求中的域名解析出对应的IP地址 阶段二 访问网站服务器IP获取网站内容 阶段一
  • spring使用AOP技术对DAO层操作进行增强功能

    AOP的概述 1 什么是AOP的技术 在软件业 AOP为Aspect Oriented Programming的缩写 意为 面向切面编程 AOP是一种编程范式 隶属于软工范畴 指导开发者如何组织程序结构 AOP最早由AOP联盟的组织提出的