Spring框架学习三:面向切面编程AOP

一篇文章搞懂spring aop,什么是AOP,什么是面向切面编程,动态代理实现AOP,Spring boot 实现Aop,spring 实现aop,附代码图文演示(保姆级教程) spring、aop、oop、java 阅读详情

一、AOP介绍

什么是AOP

在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP(面向对象编程)的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码
经典应用:事务管理、性能监视、安全检查、缓存 、日志等

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

AOP实现原理

aop底层将采用代理机制进行实现。
接口 + 实现类 :spring采用 jdk 的动态代理Proxy。
实现类:spring 采用 cglib字节码增强。

AOP术语【掌握】

1. target:目标类,需要被代理的类。例如:UserService
2. Joinpoint(连接点):所谓连接点是指那些可能被拦截到的方法。例如:所有的方法
3. PointCut 切入点:已经被增强的连接点。例如:addUser()
4. advice:通知/增强,增强代码。例如:after、before
5. Weaving(织入):是指把增强advice应用到目标对象target来创建新的代理对象proxy的过程.
6. proxy:代理类
7. Aspect(切面):是切入点pointcut和通知advice的结合
    一个线是一个特殊的面。
    一个切入点和一个通知,组成成一个特殊的面。

这里写图片描述

二、Spring aop编程:全自动【掌握】

  • 从spring容器获得目标类,如果配置aop,spring将自动生成代理。
  • 要确定目标类,aspectj 切入点表达式,导入jar包
    这里写图片描述
<!-- applicationContext.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<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">
    <!-- 1 创建目标类 -->
    <bean id="userServiceId" class="com.zyj.c_spring_aop.UserServiceImpl"></bean>
    <!-- 2 创建切面类(通知) -->
    <bean id="myAspectId" class="com.zyj.c_spring_aop.MyAspect"></bean>
    <!-- 3 aop编程 
        3.1 导入命名空间
        3.2 使用 <aop:config>进行配置
                proxy-target-class="true" 声明时使用cglib代理
            <aop:pointcut> 切入点 ,从目标对象获得具体方法
            <aop:advisor> 特殊的切面,只有一个通知 和 一个切入点
                advice-ref 通知引用
                pointcut-ref 切入点引用
        3.3 切入点表达式
            execution(* com.zyj.c_spring_aop.*.*(..))
            选择方法 返回值任意   包      类名任意 方法名任意 参数任意
    -->
    <aop:config proxy-target-class="true">
        <aop:pointcut expression="execution(* com.zyj.c_spring_aop.*.*(..))" id="myPointCut"/>
        <aop:advisor advice-ref="myAspectId" pointcut-ref="myPointCut"/>
    </aop:config>
</beans>
@Test
public void demo01(){
    String xmlPath = "com/zyj/c_spring_aop/applicationContext.xml";
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);

    //获得目标类
    UserService userService = (UserService) applicationContext.getBean("userServiceId");
    userService.addUser();
    userService.updateUser();
    userService.deleteUser();
}

三、AspectJ

AspectJ是一个基于Java语言的AOP框架
Spring2.0以后新增了对AspectJ切点表达式支持
@AspectJ 是AspectJ1.5新增功能,通过JDK5注解技术,允许直接在Bean类中定义切面
新版本Spring框架,建议使用AspectJ方式来开发AOP
主要用途:自定义开发

切入点表达式【掌握】
1.execution() 用于描述方法 【掌握】

语法:execution(修饰符  返回值  包.类.方法名(参数) throws异常)
            修饰符,一般省略
            public      公共方法
            *           任意
            返回值,不能省略
            void        返回没有值
            String      返回值字符串
            *           任意
        包,[省略]
            com.itheima.crm             固定包
            com.itheima.crm.*.service   crm包下面子包任意 (例如:com.itheima.crm.staff.service)
            com.itheima.crm..           crm包下面的所有子包(含自己)
            com.itheima.crm.*.service.. crm包下面任意子包,固定目录service,service目录任意包
        类,[省略]
            UserServiceImpl         指定类
            *Impl                   以Impl结尾
            User*                   以User开头
            *                       任意
        方法名,不能省略
            addUser                 固定方法
            add*                    以add开头
            *Do                     以Do结尾
            *                       任意
        (参数)
            ()                      无参
            (int)                   一个整型
            (int ,int)              两个
            (..)                    参数任意
        throws ,可省略,一般不写。

综合1

execution(* com.zyj.crm.*.service..*.*(..))

综合2

<aop:pointcut expression="execution(* com.zyj.*WithCommit.*(..)) || execution(* com.zyj.*Service.*(..))" id="myPointCut"/>

四、AspectJ 通知类型

  1. aop联盟定义通知类型,具有特性接口,必须实现,从而确定方法名称。
  2. aspectj 通知类型,只定义类型名称以及方法格式。
  3. 个数:6种,知道5种,掌握1种(around)。
before:前置通知(应用:各种校验)
    在方法执行前执行,如果通知抛出异常,阻止方法运行
afterReturning:后置通知(应用:常规数据处理)
    方法正常返回后执行,如果方法中抛出异常,通知无法执行
    必须在方法执行后才执行,所以可以获得方法的返回值。
around:环绕通知(应用:十分强大,可以做任何事情)
    方法执行前后分别执行,可以阻止方法的执行
    必须手动执行目标方法
afterThrowing:抛出异常通知(应用:包装异常信息)
    方法抛出异常后执行,如果方法没有抛出异常,无法执行
after:最终通知(应用:清理现场)
    方法执行完毕后执行,无论方法中是否出现异常
环绕(around)
try{
    //前置:before
    //手动执行目标方法
    //后置:afterRetruning
} catch(){
    //抛出异常 afterThrowing
} finally{
    //最终 after
}

代码示例

基于xml
1.目标类:接口 + 实现
2.切面类:编写多个通知,采用aspectj 通知名称任意(方法名任意)
3.aop编程,将通知应用到目标类
4.测试

/**
 * 切面类,含有多个通知
 */
public class MyAspect {

    public void myBefore(JoinPoint joinPoint){
        System.out.println("前置通知 : " + joinPoint.getSignature().getName());
    }

    public void myAfterReturning(JoinPoint joinPoint,Object ret){
        System.out.println("后置通知 : " + joinPoint.getSignature().getName() + " , -->" + ret);
    }

    public Object myAround(ProceedingJoinPoint joinPoint) throws Throwable{
        System.out.println("前");
        //手动执行目标方法
        Object obj = joinPoint.proceed();
        System.out.println("后");
        return obj;
    }

    public void myAfterThrowing(JoinPoint joinPoint,Throwable e){
        System.out.println("抛出异常通知 : " + e.getMessage());
    }

    public void myAfter(JoinPoint joinPoint){
        System.out.println("最终通知");
    }
}
<!-- applicationContext.xml -->
<!-- 1 创建目标类 -->
<bean id="userServiceId" class="com.zyj.d_aspect.a_xml.UserServiceImpl"></bean>
<!-- 2 创建切面类(通知) -->
<bean id="myAspectId" class="com.zyj.d_aspect.a_xml.MyAspect"></bean>
<!-- 3 aop编程 
    <aop:aspect> 将切面类 声明“切面”,从而获得通知(方法)
        ref 切面类引用
    <aop:pointcut> 声明一个切入点,所有的通知都可以使用。
        expression 切入点表达式
        id 名称,用于其它通知引用
-->
<aop:config>
    <aop:aspect ref="myAspectId">
        <aop:pointcut expression="execution(* com.zyj.d_aspect.a_xml.UserServiceImpl.*(..))" id="myPointCut"/>
        <!-- 3.1 前置通知 
            <aop:before method="" pointcut="" pointcut-ref=""/>
                method : 通知,及方法名
                pointcut :切入点表达式,此表达式只能当前通知使用。
                pointcut-ref : 切入点引用,可以与其他通知共享切入点。
            通知方法格式:public void myBefore(JoinPoint joinPoint){
                参数1:org.aspectj.lang.JoinPoint  用于描述连接点(目标方法),获得目标方法名等
            例如:
        <aop:before method="myBefore" pointcut-ref="myPointCut"/>
        -->
        <!-- 3.2后置通知  ,目标方法后执行,获得返回值
            <aop:after-returning method="" pointcut-ref="" returning=""/>
                returning 通知方法第二个参数的名称
            通知方法格式:public void myAfterReturning(JoinPoint joinPoint,Object ret){
                参数1:连接点描述
                参数2:类型Object,参数名 returning="ret" 配置的
            例如:
        <aop:after-returning method="myAfterReturning" pointcut-ref="myPointCut" returning="ret" />
        -->
        <!-- 3.3 环绕通知 
            <aop:around method="" pointcut-ref=""/>
            通知方法格式:public Object myAround(ProceedingJoinPoint joinPoint) throws Throwable{
                返回值类型:Object
                方法名:任意
                参数:org.aspectj.lang.ProceedingJoinPoint
                抛出异常
            执行目标方法:Object obj = joinPoint.proceed();
            例如:
        <aop:around method="myAround" pointcut-ref="myPointCut"/>
        -->
        <!-- 3.4 抛出异常
            <aop:after-throwing method="" pointcut-ref="" throwing=""/>
                throwing :通知方法的第二个参数名称
            通知方法格式:public void myAfterThrowing(JoinPoint joinPoint,Throwable e){
                参数1:连接点描述对象
                参数2:获得异常信息,类型Throwable ,参数名由throwing="e" 配置
            例如:
        <aop:after-throwing method="myAfterThrowing" pointcut-ref="myPointCut" throwing="e"/>
        -->
        <!-- 3.5 最终通知 -->           
        <aop:after method="myAfter" pointcut-ref="myPointCut"/>
    </aop:aspect>
</aop:config>
【Spring】 AOP面向切面编程 横切关注点从每个方法中抽取出来的同一类非核心业务。在同一个项目中,我们可以使用多个横切关注点对相关方法进行多个不同方面的增强。有十个附加功能,就有十个横切关注点。AOP核心关注点和横切关注点。业务处理的主要流程是核心关注点,非核心代码是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处基本相似,比如权限认证、日志、事务、异常等。AOP的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。(分离核心业务代码与非核心代码通知(增强)每一个横切关注点。 阅读详情

相关推荐

Cartographer纯定位实战:从仿真到真机部署的避坑指南

本文详细介绍了将Cartographer算法应用于机器人纯定位模式的完整实战流程。通过对比传统AMCL方案的不足,阐述了Cartographer基于子图匹配实现高精度、高鲁棒性定位的优势。内容涵盖从仿真环境测试到真机部署的核心步骤,包括关键配置文件修改、源码调整以及参数调优,旨在帮助开发者避开常见陷阱,成功实现稳定可靠的机器人定位系统。

weixin_29063681的博客 251

spring项目中target项目是什么‘’_手把手教你搭建一个SSM项目

SSM(Spring+SpringMVC+MyBatis)框架集由Spring、MyBatis两个开源框架整合而成(SpringMVC是Spring中的部分内容)。常作为数据源较简单的web项目的框架。下面手把手教你使用IDEA搭建一个SSM项目:新建projectFile—》新建project,使用maven作为包管理工具,因为我这里使用了父项目,所以我是新建一个module,都一样的...

weixin_39707612的博客 2593

小白学电路之cadance搭建buffer电路

Buffer(缓冲器)是一种放大器或驱动电路,主要用于隔离输入和输出,以防止负载对前级电路造成干扰或影响。本文作者在电路方面是小白水平,目前正在学习,有不足之处欢迎指正。3.创建新的cellview,对此buffer进行仿真验证。2.创建buffer的symbol。电路中的V2的详细参数。

weixin_58051657的博客 1984

spring maven项目下的target文件夹

target文件夹是用来存放项目构建后的文件和目录、jar包、war包、编译的class文件,都是maven构建时生成的。 在idea的spring boot项目中,如果target目录中没有同步更新目录文件和资源就会报错。 需要删除target文件夹,然后maven会再次构建生成,这样就不会报错了 ...

wangooo的博客 1万+

ARM Memory Compiler实战指南:从参数配置到GDSII生成的全流程解析

本文详细解析了ARM Memory Compiler在SRAM设计中的全流程应用,从基础参数配置到GDSII文件生成。涵盖SRAM类型选择、核心参数配置策略、高级优化技巧及TSMC 28nm工艺下的实战案例,帮助IC设计工程师高效实现存储器模块的优化设计。

game4的博客 416

内网开发必备:银河麒麟V10离线安装全流程(含镜像挂载+yum源配置)

本文详细介绍了在内网隔离环境下,银河麒麟V10操作系统的离线安装与部署全流程。核心内容包括官方镜像的获取与校验、使用mount命令进行镜像挂载的详细步骤与问题排查,以及构建稳定、可维护的本地Yum软件仓库的完整方法论。通过实战案例演示了如何基于本地源部署LNMP环境,并提供了高级配置技巧与常见故障排除指南,旨在帮助运维人员系统性地构建高可用的内网软件供应链。

weixin_29268637的博客 556

SpringBoot学习---SpringBoot项目的目录结构

注意包的使用,SpringBoot默认注解会扫描此启动类目录开始及下面的所有子类,如果其他文件不在此目录下需要在启动类中加@ComponentScan(basePackages = {" com.jxau.test"}) 注解进行扫描。属性,可以提供一个更加细粒度的包扫描配置,只扫描指定的包及其子包,避免不必要的扫描。这两个脚本分别对应的是linux和windows环境,可执maven相关的命令,通常使用的较少。这是记录项目目录、项目的maven、所有的依赖以及相应的版本号的文件。

weixin_55319943的博客 1356

用扩展点为 Fiori Elements 添加自定义动作:从原理到落地的完整实践

本文介绍了如何在基于OData V4的Fiori Elements应用中通过Extension Points添加自定义Action按钮。主要内容包括: 扩展点动作与标准注解动作的区别:扩展点用于非标准前端流程、组合操作等场景,需通过extensionAPI与框架交互。 扩展点动作的插入位置:可放置在List Report表格工具栏、Object Page页眉/页脚/Section工具栏等位置,并说明了相应的manifest.json配置节点。 配置模型与处理函数契约:详细说明了press、visible/e

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 248

【知识】SpringBoot项目结构目录

Spring boot 目录结构 一、主要目录 目录名称 相对路径 主要用途 源码目录 src\main\java 存储源码 资源目录 src\main\resources 存储静态资源、动态页面、配置文件 测试目录 src\test\java 存储单元测试、测试程序 java目录是进行编程和开发的主要目录,业务逻辑代码在这里完成。 DemoApplication.java 入门口类 在生成的springboot项目中有一个入口类,需要添加注解@SpringBootAppli

请你喝杯Java 1万+

推荐系统[八]算法实践总结V3:重排在快手短视频推荐系统中的应用and手淘信息流多兴趣多目标重排技术

快手推荐系统包括了传统的召回、粗排、精排、Learning To Rank 的多目标排序、多目标预估等技术环节。而在这些模块之后的技术环节就属于重排序,主要包括手机端和服务端两部分。服务端通过传统服务器部署重排服务,包括序列重排、多源内容混排、多样性模块。端上部分包括端上重排模型和端上重排策略两部分。重排技术是快手十分重要的技术环节,它的发展速度远快于其他排序环节,属于较新的技术范畴。整个序列的价值并非单 item 效果的累计,如何使得序列价值最大化;

丨汀、的博客 1061

Allegro格式PCB转换成Pads操作指导

变量:AEX_BIN_ROOT 值:D: MentorGraphics>PADSVX1.2>SDD_HOME>translators>win32bin (值:软件按装的位置,可以是9.5版本,也可以是VX1.0等不同的版本)。变量:HOME 值:C:Users>win7>AppData>Roaming>SPB_Data (这个值是allegro快捷键存放位置器,也可以随意放置在那个盘,我们可以采用默认的路径)。第4步:打开 PADSLayout软件,然后选择导入文件,选择刚刚处理的 allegro文件。

weixin_54787054的博客 3717

spring aop this、target说明

spring aop this、target说明

weixin_43931625的博客 1004

Trae中配置和使用MCP 服务保姆级教程

您好,我是程序员夏叶,深度AI编程使用者,专注于分享AI编程方面的使用技巧和经验,有兴趣的可以关注我的公众号,一起学习,共同进步。从21号开始,Trae开始陆陆续续的灰度推送了一次新版本,有的用户是21号收到的更新,有的用户是22号收到的更新,本次更新我愿称之为王炸级更新,具体更新内容可以去看我的上一篇文章。本次更新其中的一个内容就是支持了MCP 服务,那么什么是MCP呢,它的全称是。

cpp加油站的专栏 8194

Spring框架AOP学习总结(下)

文章目录1、 AOP 的概述1、1 为什么学习 AOP1、2 AOP底层实现: 代理机制(了解)2、 Spring 的基于 AspectJ 的 AOP 开发(XML 的方式)2.1 AOP 的开发中的相关术语:2.2 Spring 使用 AspectJ 进行 AOP 的开发入门(XML 的方式):2.2.1 引入相应的 jar 包2.2.2 引入 Spring 的配置文件2.2.3 编写目标类...

宜春 1万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Spring AOP 面向切面编程

Spring AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中的一个核心功能,用于在应用程序中实现横切关注点(cross-cutting concerns)的模块化。在传统的面向对象编程(OOP)中,横切关注点(如日志记录、性能监控、事务管理、安全控制等)往往散布在整个代码库中,导致代码的复用性和可维护性下降。AOP提供了一种将这些关注点从它们所服务的业务逻辑中分离出来的方式。切面(Aspect)切面是描述横切关注点的模块。它封装了影响多个类的行为。

zhzjn的博客 1887

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Spring三大核心思想之AOP(面向切面编程)

Spring三大核心思想之AOP(面向切面编程) 学习Spring三大核心思想之AOP之前建议先学习: ????1、Srping之IOC思想及使用 ????2、Spring核心思想AOP的底层设计模式之代理模式 ???? 程序员小王的博客:程序员小王的博客 ???? 欢迎点赞 ???? 收藏 ⭐留言 ???? ???? 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕 ????java自学的学习路线:java自学的学习路线 一、什么是AOP(面向切面编程)? AOP 为 Aspec

程序员小王的博客 3896

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Spring框架AOP(面向切面编程)

本文是Spring框架AOP相关的知识点 文章目录一.AOP介绍二.AOP作用三.AOP相关术语四.Spring AOP 基础知识1)JDK动态代理实现2) CGlib实现代理 一.AOP介绍 AOP(Aspect Oriented Programming)面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spri...

末尾卡片和博主交流学习! 1583

Spring框架-AOP(面向切面编程)

Spring AOP(Aspect-Oriented Programming,面向切面编程)是 Spring 框架的一个重要特性。它提供了一种通过横向切割应用程序的方式来解耦和增强代码的能力。AOP 可以在不修改原有业务逻辑的情况下,通过将通用功能模块化并横向应用于多个不同的对象上,实现横切关注点的统一处理。

陆卿之的博客 1452

Spring系列学习五、Spring框架下的面向切面编程(AOP)

AOP英文全称:Aspect Oriented Programming(面向切面编程、面向方面编程),其实说白了,面向切面编程就是面向特定方法编程。他的作用在程序运行期间在不修改源代码的基础上对已有方法进行增强(无侵入性: 解耦),从而实现业务代码的无侵入

编程小蜜蜂 1062

Spring AOP面向切面编程

AOP一种区别于OOP的编程思维,用来完善和解决OOP的非核心代码冗余和不方便统一维护问题!代理技术(动态代理|静态代理)是实现AOP思维编程的具体技术,但是自己使用动态代理实现代码比较繁琐!Spring AOP框架,基于AOP编程思维,封装动态代理技术,简化动态代理技术实现的框架!SpringAOP内部帮助我们实现动态代理,我们只需写少量的配置,指定生效范围即可,即可完成面向切面思维编程的实现!

qq_73607317的博客 1129

Spring——面向切面编程(AOP)

本文介绍了切向切面编程(AOP)中的各个概念,并用两个案例分别讲解了如何通过注解和XML配置的方式使用AOP。

行者无疆的博客 4339

Spring之面向切面编程AOP(三)

上两节提到Spring的装配bean还有高级装配,这一节就是Spring的另一个核心内容-AOP AOP的基本概念AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等通用的辅助模块,在系统的很多模块都要添加。日志,事务,权限等就是切面,使用这种面向切面编程时,我们仍然可以在一个地方声明通用功能(切面),然后声明这个功能在何时通过何种方式使用,而无需修改应用这个

heihei 8600

【JavaEE】面向切面编程AOP是什么-Spring AOP框架的基本使用

本文主要讲解AOP是什么,AOP的组成Aspect、Pointcut、Advice、Join Point,Spring AOP是什么,Spring AOP的使用、动态代理是什么、JDK Proxy和CGKLIB的区别

Carefree_State的博客 1570

【Spring框架】揭秘AOP面向切面编程以及Spring事务管理

• AOP是OOP的延续,是软件开发中的一个热点,是java开发中的一个重要内容。• AOP(Aspect Oriented Programming)意为 面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。• 利用AOP可以对业务逻辑和非业务逻辑进行隔离,从而使得各部分之间的 耦合度降低,提高程序的可重用性,同时提高了开发的效率。面向切面编程的好处就是:减少重复, 专注业务AOP(Aspect Oriented Programming)意为 面向切面编程。

小谷同学的博客 1188

[Spring] AOP面向切面编程

AOP执行流程,切点表达式,通知类型,切点数据获取

沫洺的博客 1528
上一篇: Activiti工作流框架学习三:流程变量
下一篇: Activiti工作流框架学习四:个人任务和组任务
章 鱼
博客等级 码龄10年 203粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值