热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Spring基础知识day03动态代理Spring中的AOP

一、AOP的相关概念1.1AOP概述:1.1.1什么是AOP:AOP全称是AspectOrientedProgramming即:面向

一、AOP 的相关概念

1.1 AOP 概述:

1.1.1 什么是 AOP: 

AOP全称是 Aspect Oriented Programming 即:面向切面编程。 简单的说它就是把我们程序重复的代码抽取出来,在需要执行的时候,使用动态代理的技术,在不修改源码的基础上,对我们的已有方法进行增强。

1.1.2 AOP 的作用及优势: 

作用: 在程序运行期间,不修改源码对已有方法进行增强。 

优势: 

            减少重复代码 

            提高开发效率 

            维护方便

1.1.3 AOP 的实现方式:使用动态代理技术

1.2 AOP 的具体应用:

1.2.1 开发中出现的问题:

        当我们控制数据库进行增删改查操作时,我们使用 connection 对象的 setAutoCommit(true) 此方式控制事务,如果我们每次都执行一条 sql 语句,没有问题,但是如果业务方法一次要执行多条 sql 语句,这种方式就无法实现功能了。

        当我们执行多条sql语句时,如果执行的过程中有异常,由于我们每次执行持久层方法都是独立事务,导致无法实现事务控制(不符合事务的一致性)

        解决办法: 让业务层来控制事务的提交和回滚

1.2.2 业务层来控制事务的提交和回滚出现的新问题:

        通过对业务层改造,已经可以实现事务控制了,但是由于我们添加了事务控制, 导致业务层方法变得臃肿了,里面充斥着很多重复代码。并且业务层方法和事务控制方法耦合了。 

        如果此时提交,回滚,释放资源中任何一个方法名变更,都需要修改业务层的代码,非常的不方便。

        解决方案:使用动态代理

1.2.3 动态代理回顾

1.2.3.1 动态代理的特点:字节码随用随创建,随用随加载。

1.2.3.2 动态代理常用的两种方式:

基于接口的动态代理:

        提供者:JDK 官方的 Proxy 类。 

        要求:被代理类最少实现一个接口。

基于子类的动态代理:

        提供者:第三方的 CGLib,如果报 asmxxxx 异常,需要导入 asm.jar。 

        要求:被代理类不能用 final 修饰的类(最终类)。

1.2.3.3 使用基于接口的动态代理:

 

 

1.2.4 使用动态代理解决事务问题:

 

 

总结:当我们使用动态代理之后,业务层用于控制事务的重复代码就都可以删掉了。

二、Spring 中的 AOP

2.1 Spring 中 AOP 的细节

2.1.1 说明:我们学习spring的 aop,就是通过配置的方式,实现上一章节的功能。

2.1.2 AOP 相关术语:

        Joinpoint(连接点):所谓连接点是指那些被拦截到的点。在 spring 中,这些点指的是方法,因为 spring 只支持方法类型的连接点。 

        Pointcut(切入点):所谓切入点是指我们要对哪些 Joinpoint 进行拦截的定义

        Advice(通知/增强):所谓通知是指拦截到 Joinpoint 之后所要做的事情就是通知。 通知的类型:前置通知,后置通知,异常通知,最终通知,环绕通知。                                  Introduction(引介): 引介是一种特殊的通知在不修改类代码的前提下, Introduction 可以在运行期为类动态地添加一些方法或 Field。 

        Target(目标对象): 代理的目标对象。 

        Weaving(织入): 是指把增强应用到目标对象来创建新的代理对象的过程。 spring 采用动态代理织入,而 AspectJ 采用编译期织入和类装载期织入。 

        Proxy(代理): 一个类被 AOP 织入增强后,就产生一个结果代理类。                        Aspect(切面): 是切入点和通知(引介)的结合。

2.2 基于 XML 的 AOP 配置:

2.2.1 环境搭建:

2.2.1.1 第一步:准备必要的代码: 此处包含了实体类,业务层和持久层代码。

2.2.1.2 第二步:拷贝必备的 jar 包到工程的 lib 目录

 

2.2.1.3 第三步:创建 spring 的配置文件并导入约束

 

2.2.1.4 第四步:配置 spring 的 ioc

 

 

2.2.1.5 第五步:抽取公共代码制作成通知

 

2.2.2 配置步骤

2.2.2.1 第一步:把通知类用 bean 标签配置起来

 

2.2.2.2 第二步:使用 aop:config 声明 aop 配置

aop:config

                作用:用于声明开始 aop 的配置

               

                        <配置代码>

               

2.2.2.3 第三步&#xff1a;使用 aop:aspect 配置切面

 

2.2.2.4 第四步&#xff1a;使用 aop:pointcut 配置切入点表达式

 

2.2.2.5 第五步&#xff1a;使用 aop:xxx 配置对应的通知类型

        aop:before 

            作用&#xff1a; 用于配置前置通知。指定增强的方法在切入点方法之前执行 

            属性&#xff1a; 

                       method:用于指定通知类中的增强方法名称 

                       ponitcut-ref&#xff1a;用于指定切入点的表达式的引用 

                       poinitcut&#xff1a;用于指定切入点表达式 

            执行时间点&#xff1a; 

                       切入点方法执行之前执行

       aop:after-returning

            作用&#xff1a; 用于配置后置通知 

            属性&#xff1a; 

                    method&#xff1a;指定通知中方法的名称。 

                    pointct&#xff1a;定义切入点表达式 

                    pointcut-ref&#xff1a;指定切入点表达式的引用 

           执行时间点&#xff1a; 

                    切入点方法正常执行之后。它和异常通知只能有一个执行

        aop:after-throwing 

            作用&#xff1a; 用于配置异常通知 

            属性&#xff1a; 

                    method&#xff1a;指定通知中方法的名称。 

                    pointct&#xff1a;定义切入点表达式 

                    pointcut-ref&#xff1a;指定切入点表达式的引用 

            执行时间点&#xff1a; 

                    切入点方法执行产生异常后执行。它和后置通知只能执行一个

        aop:after 

            作用&#xff1a; 用于配置最终通知 

            属性&#xff1a; 

                    method&#xff1a;指定通知中方法的名称。 

                    pointct&#xff1a;定义切入点表达式 

                    pointcut-ref&#xff1a;指定切入点表达式的引用 

            执行时间点&#xff1a; 

                    无论切入点方法执行时是否有异常&#xff0c;它都会在其后面执行。

2.2.3 切入点表达式说明&#xff1a;

            execution:匹配方法的执行(常用) 

            execution(表达式) 

            表达式语法&#xff1a;execution([修饰符] 返回值类型 包名.类名.方法名(参数))

            通常情况下&#xff0c;我们都是对业务层的方法进行增强&#xff0c;所以切入点表达式都是切到业务层实现类&#xff1a; 

            execution(* com.itheima.service.impl.*.*(..))

2.2.4 环绕通知

 

2.3基于注解的 AOP 配置

2.3.1 环境搭建

2.3.1.1 第一步&#xff1a;准备必要的代码和 jar 包

2.3.1.2 第二步&#xff1a;在配置文件中导入 context 的名称空间

2.3.1.3 第三步&#xff1a;把资源使用注解配置

2.3.1.4 第四步&#xff1a;在配置文件中指定 spring 要扫描的包

2.3.2 配置步骤

2.3.2.1 第一步&#xff1a;把通知类也使用注解配置

2.3.2.2 第二步&#xff1a;在通知类上使用&#64;Aspect 注解声明为切面

 

2.3.2.3 第三步&#xff1a;在增强的方法上使用注解配置通知

 

2.3.2.4 第四步&#xff1a;在 spring 配置文件中开启 spring 对注解 AOP 的支持

 





推荐阅读
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
author-avatar
YU亚菲
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有