Java框架_Spring5_day07_AOP(面向切面编程)

使用AspectJ开发AOP 一.前提了解Spring中的通知类型 1.org.springframework.aop.MethodBeforeAdvice(前置通知) 在目标方法执行前实施增强,可用于权限管理等功能。 2.org.springframework.aop.AfterReturningAdvice(后置通知) 在目标方法执行后实施增强,可用于关闭流、上传文件、删除临时文件等功能。 3.o... 阅读详情

目录

九、Spring 中的 AOP

9.1 AOP 的细节

9.1.1 AOP 的相关术语

9.2 Spring 的 AOP 配置

9.2.1 applicationContext.xml

9.2.2 切入点表达式的写法

9.2.3 配置文件的修改

9.3 Spring AOP 的五种通知类型(使用XML)

9.3.1 Logger.java

9.3.2 applicationContext.java

9.4 Spring AOP 的注解方式配置五种通知类型

9.4.1 Logger.java

9.4.2 ConfigurationContext.java


九、Spring 中的 AOP

9.1 AOP 的细节

9.1.1 AOP 的相关术语

Joinpoint(连接点): (方法)

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

       目标对象中的所有方法,就是连接点。

Pointcut(切入点): (方法)

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

       目标对象中的某些方法:被增强的方法就是切入点。

Advice(通知/增强): (方法)

       所谓通知是指拦截到Joinpoint之后所要做的事情就是通知。

       通知的类型:前置通知,后置通知,异常通知,最终通知,环绕通知。

       需要增强的方法就是通知。

Target(目标对象):

       代理的目标对象。

Weaving(织入): 

       是指把增强应用到目标对象来创建新的代理对象的过程。

       spring采用动态代理织入,而AspectJ采用编译期织入和类装载期织入。

Proxy(代理):

       一个类被AOP织入增强后,就产生一个结果代理类。

Aspect(切面): (类)

       是切入点和通知(引介)的结合。

       通知的方法需要放置到一个类中,该类就是切面。

Introduction(引介): 

       引介是一种特殊的通知在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field。

9.2 Spring 的 AOP 配置

【需求】在访问 AccountServiceImpl.java 中的方法之前,添加日志操作

9.2.1 applicationContext.xml

    <!--创建Service(目标对象)-->
    <bean id="accountService" class="com.cpz.service.impl.AccountServiceImpl"></bean>
    <!--spring的aop配置,明确切面(类)、通知(方法)、切入点(方法)-->
    <!--创建Logger(没有灵魂的切面)-->
    <bean id="logger" class="com.cpz.utils.Logger"></bean>
    <!--引入aop的空间,配置spring的aop-->
    <aop:config>
        <!--2:配置切入点
                expression:定义切入点的表达式
                    参数一:访问修饰符(非必填)
                    参数二:返回值(必填)
                    参数三:包名.类名(非必填),建议写上,如果不写,认为所有的类都是切入点
                    参数四:方法名(参数)(必填)
                    参数五:异常(非必填)

                              访问修饰符  返回值  包名.包名.包名...类名.方法名(参数列表)

            -->
        <aop:pointcut id="myPointcut" expression="execution(public void com.cpz.service.impl.AccountServiceImpl.saveAccount())"></aop:pointcut>
        <!--<aop:pointcut id="myPointcut1" expression="execution(public void com.cpz.service.impl.AccountServiceImpl.updateAccount(int))"></aop:pointcut>-->
        <!--<aop:pointcut id="myPointcut2" expression="execution(public int com.cpz.service.impl.AccountServiceImpl.deleteAccount())"></aop:pointcut>-->

        <!--1:配置切面(有灵魂的切面)-->
        <aop:aspect id="myAspect" ref="logger">
            <!--3:配置通知(前置通知:表示在访问目标对象方法之前,执行通知)
                method="":通知的方法名称
            -->
            <aop:before method="printLog" pointcut-ref="myPointcut"></aop:before>
            <!--<aop:before method="printLog" pointcut-ref="myPointcut1"></aop:before>-->
            <!--<aop:before method="printLog" pointcut-ref="myPointcut2"></aop:before>-->
        </aop:aspect>
    </aop:config>

9.2.2 切入点表达式的写法

切入点表达式的写法​ 关键字:execution(表达式)​ 表达式:

       参数一:访问修饰符(非必填)

       参数二:返回值(必填)

       参数三:包名.类名(非必填)

       参数四:方法名(参数)(必填)

       参数五:异常(非必填)​ 访问修饰符 返回值 包名.包名.包名...类名.方法名(参数列表)

标准的表达式写法:
     public void com.cpz.service.impl.AccountServiceImpl.saveAccount()

访问修饰符可以省略
     void com.cpz.service.impl.AccountServiceImpl.saveAccount()
     返回值可以使用通配符(*:表示任意),表示任意返回值
        * com.cpz.service.impl.AccountServiceImpl.saveAccount()
     包名可以使用通配符,表示任意包。但是有几级包,就需要写几个*.
        * *.*.*.*.AccountServiceImpl.saveAccount())
     包名可以使用..表示当前包及其子包
        * *..AccountServiceImpl.saveAccount()
     类名和方法名都可以使用*来实现通配(一般情况下,不会这样配置)
                    * *..*.*() == * *()
     参数列表:
          可以直接写数据类型:
             基本类型直接写名称           int
             引用类型写包名.类名的方式     java.lang.String
                    可以使用通配符表示任意类型,但是必须有参数
                    可以使用..表示有无参数均可,有参数可以是任意类型
     全通配写法:* *..*.*(..)

实际开发中切入点表达式的通常写法:切到业务层实现类下的所有方法:* com.cpz.service..*.*(..)

9.2.3 配置文件的修改

    <aop:config>
        <aop:pointcut id="myPointcut" expression="execution(* com.cpz.service..*.*(..))"></aop:pointcut>
        <aop:aspect id="myAspect" ref="logger">
            <aop:before method="printLog" pointcut-ref="myPointcut"></aop:before>
        </aop:aspect>
    </aop:config>

9.3 Spring AOP 的五种通知类型(使用XML)

前置通知、后置通知、异常通知、最终通知、环绕通知。

9.3.1 Logger.java

package com.cpz.utils;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;

public class Logger {

    // 前置通知
    public void beforePrintLog(JoinPoint jp){
        System.out.println("前置通知  类名:" + jp.getSignature().getDeclaringTypeName().getName() + ",  方法名:" + jp.getSignature().getName());
    }

    // 后置通知
    public void afterReturningPrintLog(JoinPoint jp){
        System.out.println("后置通知  类名:" + jp.getSignature().getDeclaringTypeName().getName() + ",  方法名:" + jp.getSignature().getName());
    }

    // 异常通知
    public void afterThrowingPrintLog(JoinPoint jp){
        System.out.println("异常通知  类名:" + jp.getSignature().getDeclaringTypeName().getName() + ",  方法名:" + jp.getSignature().getName());
    }

    // 最终通知
    public void afterPrintLog(JoinPoint jp){
        System.out.println("最终通知  类名:" + jp.getSignature().getDeclaringTypeName().getName() + ",  方法名:" + jp.getSignature().getName());
    }

    // 环绕通知
    public Object aroundPrintLog(ProceedingJoinPoint pjp){
        Object returnValue = null;
        try{
            beforePrintLog(pjp);
            returnValue = pjp.proceed(pjp.getArgs());
            afterReturningPrintLog(pjp);
            return returnValue;
        } catch (Throwable throwable) {
            throwable.printStackTrace();
            afterThrowingPrintLog(pjp);
        } finally {
            afterPrintLog(pjp);
        }
        return returnValue;
    }


}

9.3.2 applicationContext.java

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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">

    <bean id="accountService" class="com.cpz.service.impl.AccountServiceImpl"></bean>

    <bean id="logger" class="com.cpz.utils.Logger"></bean>

    <aop:config>
        <aop:pointcut id="myPointcut" expression="execution(* com.cpz.service..*.*(..))"></aop:pointcut>
        <aop:aspect id="myAspect" ref="logger">
            <!--<aop:before method="beforePrintLog" pointcut-ref="myPointcut"></aop:before>-->
            <!--<aop:after-returning method="afterReturningPrintLog" pointcut-ref="myPointcut"></aop:after-returning>-->
            <!--<aop:after-throwing method="afterThrowingPrintLog" pointcut-ref="myPointcut"></aop:after-throwing>-->
            <!--<aop:after method="afterPrintLog" pointcut-ref="myPointcut"></aop:after>-->
            <aop:around method="aroundPrintLog" pointcut-ref="myPointcut"></aop:around>
        </aop:aspect>
    </aop:config>

</beans>

9.4 Spring AOP 的注解方式配置五种通知类型

9.4.1 Logger.java

package com.cpz.utils;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Component(value = "logger")
@Aspect
public class Logger {

    @Pointcut("execution(* com.cpz.service..*.*(..))")
    private void myPointcut(){}

    // 前置通知
    //@Before(value = "myPointcut()")
    public void beforePrintLog(JoinPoint jp){
        System.out.println("前置通知  类名:" + jp.getSignature().getDeclaringTypeName() + ",  方法名:" + jp.getSignature().getName());
    }

    // 后置通知
    //@AfterReturning(value = "myPointcut()")
    public void afterReturningPrintLog(JoinPoint jp){
        System.out.println("后置通知  类名:" + jp.getSignature().getDeclaringTypeName() + ",  方法名:" + jp.getSignature().getName());
    }

    // 异常通知
    //@AfterThrowing(value = "myPointcut()")
    public void afterThrowingPrintLog(JoinPoint jp){
        System.out.println("异常通知  类名:" + jp.getSignature().getDeclaringTypeName() + ",  方法名:" + jp.getSignature().getName());
    }

    // 最终通知
    //@After(value = "myPointcut()")
    public void afterPrintLog(JoinPoint jp){
        System.out.println("最终通知  类名:" + jp.getSignature().getDeclaringTypeName() + ",  方法名:" + jp.getSignature().getName());
    }

    // 环绕通知
    @Around(value = "myPointcut()")
    public Object aroundPrintLog(ProceedingJoinPoint pjp){
        Object returnValue = null;
        try{
            beforePrintLog(pjp);
            returnValue = pjp.proceed(pjp.getArgs());
            afterReturningPrintLog(pjp);
            return returnValue;
        } catch (Throwable throwable) {
            throwable.printStackTrace();
            afterThrowingPrintLog(pjp);
        } finally {
            afterPrintLog(pjp);
        }
        return returnValue;
    }


}

9.4.2 ConfigurationContext.java

package com.cpz.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@Configuration
@ComponentScan(basePackages = "com.cpz")
@EnableAspectJAutoProxy
public class ConfigurationContext {

}

 

Day12_Spring Spring 是个java企业级应用的开源开发框架。简化Java企业级应用开发。 阅读详情

相关推荐

医疗AI新思路:为什么Graph Neural Network能改善气道分割的漏检问题?

本文探讨了Graph Neural Network(GNN)在医疗AI领域改善气道分割漏检问题的创新应用。通过分析3D UNet等传统方法的局限性,揭示了GNN在图结构建模中的独特优势,特别是在捕捉细小末梢支气管方面的突破性表现。文章详细介绍了UNet-GNN混合架构的设计原理、实验性能对比及优化方向,为CT影像分析提供了新思路。

weixin_30379531的博客 224

CPP官方地址

http://www.cplusplus.com/reference/string/string/?kw=string

HAKUNA 4万+

告别轮询!用STM32CubeMX给STM32F030配置ADC多通道+DMA,实测代码分享

本文详细介绍了如何使用STM32CubeMX为STM32F030配置ADC多通道采集与DMA传输,显著提升采集效率。通过实测对比轮询与DMA模式的性能差异,提供完整的代码实现和优化技巧,帮助开发者快速掌握这一高效采集方案。

weixin_42570296的博客 410

Spring与AOP系列五:AspectJ对AOP的实现

对于AOP这种编程思想,很多框架都进行了实现。Spring就是其中之一,可以完成面向切面编程。然而,AspectJ也实现了AOP的功能,且其实现方式更为简捷,使用更为方便,而且还支持注解式开发。所以,Spring又将AspectJ的对于AOP的实现也引入到了自己的框架中。 1.AspectJ简介 AspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法,它有一个...

lumaomao_的专栏 382

基于mediapipe的动作捕捉和unity的人物模型驱动

用到的人体关键点检测的算法是Google开发的基于深度学习的实时多媒体套件,汇集了人体、手部、人脸关键点追踪、物体检测、物体识别等多个流行的视觉任务的成果。整套 Mediapipe正如其名字,专门为便携设备上的多媒体应用设计,模型非常小,在笔记本手机上也能实时跑,跨平台、跨语言。mediapipe实时性是没什么问题。但是是以牺牲了质量为代价的,这种关键点检测一般是用来做动作识别,类似于运动app跳绳计数、判定瑜伽动作标不标准这种。用单目视觉来做人物模型的驱动,总差点意思。

qq_58484580的博客 5727

用Docker部署ERPNext V15:从架构原理到生产落地的完整指南

容器化部署正在重塑企业级应用的分发与运维方式,ERPNext作为开源ERP中的佼佼者,其基于Frappe框架的模块化设计天然适合用Docker进行编排。理解容器、镜像与编排的关系,是掌握ERP系统部署的基础。Frappe框架负责数据模型与API,ERPNext则承载销售、采购、财务等业务逻辑,两者通过Docker容器解耦为可独立扩展的组件。这种架构带来的价值在于:环境一致性、快速迁移与弹性伸缩,使中小团队也能以较低成本自托管业务系统。无论是替代传统SaaS,还是构建内部管理平台,掌握容器化部署已成为运维与开

weixin_32325225的博客 138

Spring框架---day07

Spring框架—day07 Aop aop—是sping中重要的一个功能, 主要进行面向切面编程。其实就是不影响主流的业务, 做为切面, 在这个切面上进行编程,然后当你的主流业务走到这个切面上的时候触发我们的一些操作。(事务的管理,缓存数据的存储,日志管理等等) aop的底层实现—动态代理。 java里边提供了代理, 静态代理(一开始的时候就知道给哪个做代理,编译的时候就已经知道(编译时增强)),动态代理(只有你运行的时候他才会知道我们做哪个代理----运行时增强),java里边也有代理, cglib这个

zll的博的博客 182

Flutter模块打包AAR集成Android原生项目实践

跨平台开发框架Flutter通过将UI组件渲染为原生代码实现高性能表现,其核心优势在于一套代码可同时运行在iOS和Android平台。在工程实践中,将Flutter模块打包为AAR(Android Archive)进行集成,成为混合开发的主流方案。这种方案既保留了原生项目的稳定性,又能渐进式引入Flutter的高效开发特性。通过配置MethodChannel实现原生与Dart代码通信,开发者可以灵活控制Flutter引擎生命周期,优化内存占用和渲染性能。对于电商、社交等需要快速迭代的业务场景,该方案能显著提

weixin_34025051的博客 399

Spring-学习笔记08【面向切面编程AOP】

Spring-学习笔记08【面向切面编程AOP】

upward 558

Ubuntu 24.04 高效部署Slurm集群:从零到生产环境实战

本文提供了一份在Ubuntu 24.04 LTS系统上从零开始部署生产级Slurm高性能计算集群的完整实战指南。内容涵盖网络配置、Munge安全认证、Slurm核心组件安装与配置,并深入讲解了cgroups资源隔离、NFS共享存储、配置无感知模式等生产环境优化技巧,最后通过实例演示如何提交与管理Slurm作业,帮助用户构建高效、稳定的计算平台。

weixin_29213655的博客 565

SAM3 LoRA Fine-Tuning|SAM3微调(完全对齐官方训练和配置)

本文介绍了基于官方SAM3模型使用LoRA技术进行图像目标检测与分割微调的项目。项目完全对齐官方训练配置,支持多类别高效微调,且不影响原模型的开放词汇提示能力。微调后模型在航拍图像中对道路、车辆等目标的分割效果显著提升,误检率降低。 项目提供完整的训练和推理流程: 支持双卡并行训练,显存需求大(完整微调需30G+显存) 提供训练脚本和配置文件,可灵活调整参数 包含推理可视化工具,支持与原模型效果对比,内置训练结果分析工具,可生成指标对比图 数据集采用COCO格式。

weixin_46248968的博客 359

Spring_Day3_AOP、AspectJ、CGLIB的代理

AOP面向切面编程(Aspect Oriented Programming), 是一种编程范式AOP 的主要目的是将横切关注点(如日志记录、事务管理、安全检查等)从业务逻辑中分离出来,以提高代码的模块化和可维护性。AOP 的实现方式通常通过等技术。它使得开发者能够在不修改原有业务逻辑代码的情况下,对其进行功能增强和扩展。利用AOP可以实现业务逻辑各个部分的隔离,从而使得业务逻辑各个部分的,提高程序的,同时提高开发效率。

zhong_in_furry的博客 1103

如何配置SSC CANopen的excel文件

如何配置 CANOpen 的 EXCEL 文件

PI_sunyang的博客 3700

Spring-学习笔记01【Spring框架简介】

Spring-学习笔记01【Spring框架简介】

upward 633

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

04 Spring:01.Spring框架简介&&02.程序间耦合&&03.Spring的 IOC 和 DI&&08.面向切面编程 AOP&&10.Spring中事务控制...

spring共四天 第一天:spring框架的概述以及spring中基于XML的IOC配置 第二天:spring中基于注解的IOC和ioc的案例 第三天:spring中的aop和基于XML以及注解的AOP配置 04 spring : 07.银行转账案例&&Java动态代理的两种实现方式 04 Spring: 08.面向切面编程 AOP&&...

weixin_30399055的博客 120

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

java-spring-boot

day01、spring-Ioc 01、Spring课程导入 一个service接口调用不同的实现类的方法,需要指定不同的实现类****,存在耦合问题,**** 02、Spring简介 Spring 是一款目前主流的 Java EE ==轻量级、全栈型 开源框架== ,是 Java 世界最为成功的框架之一。 Spring 由“Spring 之父”Rod Johnson 提出并创立,其目的是用于简化 Java 企业级应用的开发难度和开发周期。 自 ==2004== 年 4 月,Spring 1.0 版

weixin_51480322的博客 869

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Spring框架自学之路(七)

(07Day)    今天我们来看看Spring中AOP的最流行最完整的AOP---&gt;AspectJ    我们要使用AspectJ就一定要先导入AspectJ 的Jar包,AspectJ要导入的jar包为aopalliance.jar、aspectj.weaver.jar 和 spring-aspects.jar。所以加入AspectJ包后算上spring的基本jar包就一共有以下这些包。...

qq_38166944的博客 439

第三阶段---day06-day07 SpringMVC

1. Spring总结 1.1 IOC-DI 1.IOC: 控制反转,对象的生命周期由spring容器管理 2.xml配置文件的写法:bean标签 id/class xml容器的实现类 3.注解写法: @Bean 写在配置类 4.单例多例问题 默认单例 @Scope 单例:singleton 多例:prototype 5.懒加载: @lazy 用户使用时创建 6.声明周期方法: 对象创建(无参构造)/对象初始化@PostConstruct/业务调用/对象销毁@PreDestroy 7.D

weixin_61747318的博客 426

企业权限管理系统知识 day07 AOP日志

一、AOP日志 1.1 数据库与表结构 1.1.1 日志表信息描述sysLog 1.1.2 sql语句 1.1.3 实体类 1.2 基于AOP日志处理 1.2.1 页面syslog-list.jsp 1.2.2 创建切面类处理日志 1.2.3 SysLogController 1.2.4 Service 1.2.5 Dao ...

小陈工的博客 265

Spring-学习笔记06【Spring的新注解】

Spring-学习笔记06【Spring的新注解】

upward 557

Spring-学习笔记05【基于XML的IOC的案例】

Spring-学习笔记05【基于XML的IOC的案例】

upward 1186

Spring-学习笔记06【spring_day02资料_dbutils】

Spring-学习笔记06【spring_day02资料_dbutils】

upward 541

CGB2111-Day06-07-SpringMVC

文章目录 1. Spring总结 1.1 IOC-DI 1.2 AOP 1.3 Spring框架优势 2.SpringMVC 2.1 SpringMVC介绍 2.2 Servlet 知识回顾 2.3 SpringMVC入门案例 2.3.1 创建项目 2.3.2 SpringMVC开发注意事项 2.3.3 编辑HelloController 2.3.4 页面效果展现 2.4 SpringMVC 注解说明 2.5 SpringDemo测试2 2.5.1 编辑POJO 2.5.2 编辑C

m0_55070913的博客 435

Day 011 — Spring 全家桶深度拆解

本文摘要主要介绍了Spring框架的核心知识体系,包括IOC、AOP、Spring Boot等模块的关键面试点。

物联网工程专业 - 软硬兼修 554

实习日记07/14 day5

关于后端架构,以及学习目标 基础技术 J2SE:Java标准板,在项目中的重点有所侧重于数据库连接、接口定义、输入/输出以及网络编程。 J2EE:一套针对企业级分布式应用的计算环境,定义了基于组件的方式设计、开发、组装和部署企业应用系统的各个组成部分。 Spring:Spring框架是一个开放源代码的J2EE应用程序框架。最近要将Spring in Action读完,了解Spring的相关知识。理解DI和AOP的相关概念,并强化理解。虽然大部分企业都采用的是SpringBoot框架,不再使用设置繁琐的Spr

qq_43285863的博客 510

Spring-学习笔记02【程序间耦合】

Spring-学习笔记02【程序间耦合】

upward 996
上一篇: Java框架_Spring5_day06_转账案例(事务)
下一篇: Java框架_SpringMVC_day01_概念和入门
chipeize
博客等级 码龄10年 23粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值