Spring学习:AOP思想

【最全】ISTQB- FL模拟题(含答案) 汇总收集的所有ISTQB基础级考题和答案 阅读详情

什么是AOP

AOP就是面向切面编程,可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。

AOP的主要意图

将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。

可能这样说大家不是理解的很明白,那么请看下面的代码。

假设有一个业务组件Component,其中有3个业务方法:

public class Component implements Icomponent{

    public void business1()
    {
        System.out.println("业务1");
    }

    public void business2()
    {
        System.out.println("业务2");
    }
    public void business3()
    {
        System.out.println("业务3");
    }

}

现在有一个需求,在不改动业务逻辑代码的情况下,在每个业务方法执行前都必须执行一个用户验证,如下:

public void validateUser(){
  System.out.println(“验证用户”);
}

在这个情况下我们就用到了AOP。
AOP有如两种实现方式
1.静态代理
2.动态代理

AOP的静态代理

特点
①程序中调用执行的是代理对象,构造代理对象时给它一个被代理对象;
②代理对象代替真正的对象来执行其方法,并在执行过程中添加额外的职责;
③代理对象的一个接口只服务于一种类型的对象,如果代理的方法很多,势必要为每种方法进行代理。

1.将Component 的业务逻辑拿出来创建一个接口,

public interface Icomponent {

    public void business1();
    public void business2();
    public void business3();
}

2.实现代理对象,这个实现了业务逻辑接口

public class ComponentProxy implements Icomponent{

    private Component component;

    //初始化component
    public ComponentProxy(Component component)
    {
        this.component=component;
    }

    public void validateUser()
    {
        System.out.println("用户验证");
    }

    public void business1()
    {
        //加入验证用户
        this.validateUser();
        //调用原有的业务逻辑
        component.business1();
    }

    public void business2()
    {
        this.validateUser();
        component.business2();
    }

    public void business3()
    {
        this.validateUser();
        component.business3();
    }

}

3.测试函数

public class AopExample {

    public static void main(String[] args) {
        Icomponent proxy=new ComponentProxy(new Component());
        proxy.business1();
        proxy.business2();
        //用接口对象调用方法
        proxy.business3();
    }
}

AOP的动态代理

特点:使用动态代理可以使得一个处理者(Handler)服务于各个对象

通过实现InvocationHandler接口实现动态代理

public class ValidateHandler implements InvocationHandler{

    public Object delegate;

    //绑定代理对象
    public Object bind(Object delegate)
    {
        this.delegate=delegate;
        return Proxy.newProxyInstance(delegate.getClass().getClassLoader(), delegate.getClass().getInterfaces(), this);
    }

    //代理对象每次操作时都会调用invoke方法
    public Object invoke(Object proxy, Method method, Object[] args)
            throws Throwable {
        Object result=null;
        try 
        {
            System.out.println("方法开始"+method);
            this.validateUser();
            result=method.invoke(delegate, args);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    public void validateUser()
    {
        System.out.println("验证用户");
    }

}

测试函数


public class AopExample {

    public static void main(String[] args) {
        ValidateHandler validatehandler=new ValidateHandler();
        Icomponent proxy=(Icomponent)validatehandler.bind(new Component());
        proxy.business1();
        proxy.business2();
        proxy.business3();
    }
}

小结

使用代理对象将日志等与业务逻辑无关的动作或任务提取出来,设计成为一个服务对象称为Aspect,将上述这些与业务逻辑无关的动作在AOP中称之为Cross-cutting concern

SpringAOP

Aspect
散落于各个业务逻辑之中的Cross-cutting concerns收集起来,设计成为独立可重用的对象,称为Aspect。

Advice
Aspect当中对Cross-cutting concerns的具体实现称为Advice

Jointpoint
Advice在应用程序执行时加入业务流程的点或时机(只支持方法的Jointpoint)

Pointcut
Pointcut定义了感兴趣的Jointpoint,当调用的方法符合Pointcut表达式时,将Advice织入到应用程序中。

Target
被代理的对象(一个Advice被应用的对象)

Introduction
可以为某个已编写或编译完的类,在执行时期动态加入一些方法

Weave
Advice被应用到Target上的过程,不同时间点(Compile、Classload、Runtime)

由于Weave到Target的时机不同,Spring提供了几种不同的Advices(Before Advice、After Advice 、Around Advice、Throw Advice)

例如:beforeadvice可通过实现MethodBeforeAdvice接口实现

public class ValidateBeforeMethod implements MethodBeforeAdvice{

    public void before(Method arg0, Object[] arg1, Object arg2)
            throws Throwable {
        // 执行用户验证,并打印执行方法
        this.validate();
        System.out.println(arg0);

    }

    public void validate()
    {
        System.out.println("验证用户");
    }
}
//在spring的配置文件中配置bean
<bean id="validatebeforeadvice" class="com.cst.spring.lab3.ValidateBeforeMethod"/>
    <bean id="component" class="com.cst.spring.lab3.Component"/>
    <bean id="componentproxy" class="org.springframework.aop.framework.ProxyFactoryBean">
        <property name="proxyInterfaces" value="com.cst.spring.lab3.Icomponent"/>
        <property name="target" ref="component"/>
        <property name="interceptorNames">
            <list>
                <value>validatebeforeadvice</value>
            </list>
        </property>
    </bean>

//测试类
public class AopExample {

    public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
        Icomponent icom=(Icomponent)context.getBean("componentproxy");
        icom.business1();
    }
}

便可在执行icom.business1();之前调用用户验证

其余advice也是一样

spring2.0AOP的命名空间

在Spring2.0中,可以使用标签来定义After Returning Advice,不用实现AfterReturningAdvice接口,此文不在描述,想学习者自行找资料学习。(需要架包 aspectjweaver.jar、asm-.jar、asm-commons-.jar
)

本文到此结束,有错误请指出,谢谢。

探索如何利用CST和ADS进行DDR的SIPI联合仿真 本文系统介绍了CST和ADS两款工具进行DDR信号完整性/电源完整性(SI/PI)联合仿真的方法。CST采用工作室协同方式,通过PCB布局导入、材料设置、模型分配等步骤,重点分析了电源阻抗优化和信号波形质量。ADS则利用SIPro、PIPro等专用工具,突出系统级验证和自动化优化功能。两者各有优势:CST擅长3D结构精确建模,ADS更适于快速系统验证。文章建议可根据项目需求混合使用两种工具,并提供了模型简化、频带选择等实用技巧。通过对比分析,为工程师选择仿真工具提供了决策参考。 阅读详情

相关推荐

Arduino IDE 2配置ESP32-S3工程全指南

嵌入式开发中,Arduino框架通过硬件抽象层(HAL)大幅降低MCU入门门槛,其核心在于板级支持包(BSP)与底层构建系统(如ESP-IDF)的精准协同。理解CPU频率、Flash模式、分区表、PSRAM等关键配置,本质是掌握SoC时钟树、SPI Flash通信协议、内存映射与FreeRTOS调度机制的技术原理。这些参数不仅决定固件能否启动,更直接影响功耗、实时性、OTA升级与大容量应用(如LVGL、TFLite Micro)的可行性。本文以ESP32-S3为例,聚焦Arduino IDE 2.x环境下从

root9的博客 784

AOP

1. 切面(Aspect) 官方的抽象定义为“一个关注点的模块化,这个关注点可能会横切多个对象”,在本例中,“切面”就是类TestAspect所关注的具体行为,例如:AServiceImpl.barA()的调用就是切面TestAspect所关注的行为之一。“切面”在ApplicationContext中来配置。 2. 连接点(Joinpoint) 程序执行过程中的某一行为,例如,AServi

ygm147258369的博客 499

哨兵一号burst数据的下载和处理

在Sentinel - 1数据处理领域,其基本流程起始于从(ASF)下载原始压缩文件。这些文件规模颇为可观,常规大小约4GB,而部分数据的原文件甚至已攀升至7GB,对存储空间提出了严苛要求。从影像构成来看,每景Sentinel - 1影像由三个干涉宽幅(IW)模式子带组成,每个IW一般包含9个脉冲串(burst)。然而,在实际研究中,我们所关注的研究区域往往仅占据其中寥寥几个burst。

kangkangluoluo的博客 1965

spring是用aop:before报错解决方法

pom.xml添加     org.aspectj     aspectjweaver     1.8.10 重新reimport。

zff1047670763的博客 3088

(实战)[re:Invent 2018]-001:赛道分析-(致敬1024)

打印log

Rainbow 2784

抖音直播“卡黑屏”技术解析:从实现原理到平台风控与合规运营

在直播技术领域,视频流推送与实时互动是核心基础。其原理在于通过编码软件(如OBS)将音视频数据封装后,经由网络协议推送到服务器,再分发给观众。这项技术的价值在于支撑了实时、高并发的在线互动场景,是直播、在线会议等应用的基石。然而,在追求流量和互动的实践中,衍生出一些非常规操作,例如通过技术手段中断或控制视频流推送,仅保留音频和互动功能,以达到特定运营目的。这便涉及到了**卡黑屏**这一具体现象。它本质上是对直播流的人为干预,常与**流量博弈**和**风险规避**等动机相关联。从工程实践角度看,实现方式多样,

weixin_29895109的博客 1318

6Spring AOP

3Spring AOP AOP(Aspect Orient Programming),也就是面向切面编程,作为面向对象编程的一种补充。AOP专门用于处理系统中分布于各个模块中的交叉关注点的问题。AspectJ是一个java语言的AOP框架,提供了强大的AOP功能。其主要包括两个部分:第一个部分定义了如何表达,定义AOP编程中的语法规范,通过这套语言规范,我们可以方便地用AOP来解决java语言中

小飞虫 400

Matlab实战:5分钟搞定脉冲多普勒雷达信号处理仿真(附完整代码)

本文详细介绍了如何使用Matlab在5分钟内完成脉冲多普勒雷达信号处理仿真,包括环境配置、线性调频信号生成、数字下变频处理、动目标检测及性能优化技巧。通过完整代码示例和实用技巧,帮助工程师快速验证算法可行性,提升雷达信号处理效率。

nokia的博客 946

Spring @Aspect、@Before、@After 注解实现 AOP 切面功能

Spring AOP 注解概述 1、Spring 的 AOP 功能除了在配置文件中配置一大堆的配置,比如切入点、表达式、通知等等以外,使用注解的方式更为方便快捷,特别是 Spring boot 出现以后,基本不再使用原先的 beans.xml 等配置文件了,而都推荐注解编程。 @Aspect 切面声明,标注在类、接口(包括注解类型)或枚举上。 @Pointcut 切入点声明,即切入到哪些目标类的目标方法。 value 属性指定切入点表达式,默认为 "",用于被通知注解引用

蚩尤后裔-汪茂雄 7万+

海康工业相机使用:常见问题及解决方法

工业相机在使用过程中,经常会因为操作不当、使用环境不当等原因出现一些问题,本篇教程,主要针对海康工业相机常见问题及其定位方法做以简单介绍,希望可以帮助大家。 注:该教程对其他品牌工业相机“常见问题”排查,也具备一定的指导意义。 当出现无法通过客户端发现设备或者无法预览图像等问题,先确认当前的运行环境是否满足以下要求: 确认装有相机驱动软件的电脑网卡为千兆网卡(Gige接口相机); 确认网卡是否已开启巨型帧; 确认电脑与网口相机之间的网络链路为千兆; 确认装有相机驱动软件的USB接口为3...

Cche的博客 3万+

InSAR_ISCE软件数据处理流程之:利用哨兵数据获取2015年尼泊尔地震同震形变场

ISCE软件数据处理流程之:利用哨兵数据获取2015年尼泊尔地震同震形变场 ISCE软件做干涉只需要将数据准备好,并配置好insarApp.xml文件即可进行。 一、数据准备 1、SAR数据获取 本利中使用的数据为欧空局提供的sentinel-1A/B数据,可从阿拉斯加数据服务器上下载,具体下载方法可参考: 哨兵数据下载方法. 2、哨兵卫星轨道文件下载 哨兵数据处理除了需要SAR影像外,还需提供轨道参数文件,可从https://qc.sentinel1.eo.esa.int/aux_poeorb/下载。下载

weixin_42128764的博客 1万+

Spring Aop 打印controller的输入输出

文章目录1.引入依赖2.切面3 、相关知识点3.1 常用的切点标识符3.2 通知类型3.3 底层原理3.3.1 JDK动态代理3.3.2 CGLIB 关于切面: Spring AOP 使用示例:使用AOP打印所有controller接口得输入输出打印。 1.引入依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-paren

cc890824的博客 818

火灾图像检测识别:cnn卷积神经网络 Adaboost 支持向量机 随机森林 决策树 完整代码数据

火灾图像检测识别:cnn卷积神经网络 Adaboost 支持向量机 随机森林 决策树 完整代码数据

864

spring学习笔记二:spring注解配置学习,spring的aop思想学习、spring封装代理

文章目录1. spring学习笔记二:spring注解配置学习,spring的aop思想学习2. spring注解配置3. spring的STS插件4. spring与Junit整合5. aop思想5.1. aop思想应用5.2. 通过代理实现aop思想5.3. 动态代理案例一:5.4. cglib代理技术6. aop名词7. spring和代理技术的关系8. 利用spring实现代理技术8.1....

公子&小白的博客 759

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

什么是ioc_学习笔记:Spring核心思想 AOP & IOC

“拉勾教育”学习笔记:Spring核心思想 IOC 、 AOP注意:IOC和AOP不是spring提出的,在spring之前就已经存在,只不过更偏向于理论化,spring在技术层次把这两个思想做了⾮常好的实现(Java)IOC1、什么是IOC?IoC Inversion of Control (控制反转/反转控制),注意它是⼀个技术思想,不是⼀个技术实现描述的事情:Java开发领域对象的创建,管理...

weixin_39769183的博客 89

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Spring学习笔记2:注解开发、AOP思想、整合Mybatis、事务

文章目录7、使用注解开发7.1、属性如何注入1、@Component2、@Value7.2、衍生的注解7.3、自动装配7.4、作用域1、@Scope("singleton")7.5、小结9、使用java的方式配置Spring9.1、实体类User9.2、配置文件MyConfig9.3、MyConfig29.4、测试类MyTest0710、代理模式10.1、静态代理10.1.1、代码步骤10.1.2、代理模式(静态)的好处:10.1.3、静态代理加深10.2、动态代理10.2.1、例子:10.2.2、万能模板

qq_45376627的博客 368

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Spring学习笔记(二):吃透AOP核心思想,小白从零入门

Spring AOP核心概念与实战应用摘要 AOP(面向切面编程)是Spring核心思想之一,通过将重复性非业务代码(如日志、权限、事务等)抽离为切面,实现无侵入式的功能增强。其底层基于代理模式,Spring采用JDK动态代理(接口类)和CGLIB(非接口类)动态生成代理对象。 核心概念: 切点(Pointcut):定义拦截规则的表达式(如execution(* com.service.*.*(..))) 通知(Advice):增强逻辑,分为前置(@Before)、后置(@AfterReturning)、异

icedating的博客 233

spring ---- 核心思想之二 AOP 原理----编程不良人

spring 两大核心思想 其一: 控制反转 IOC (包含 DI 依赖注入) 其二: AOP 面向切面编程 https://www.bilibili.com/video/BV15E411p7vk?p=7 百知哥 讲解的AOP原理 AOP 基于 动态代理实现 ,所以要能理解动态代理是什么 AOP 中的如下几种通知,起始及时在动态代理中埋入必要的内容 前置通知 org.springframework.aop.MethodBeforeAdvice; ...

狗剩的专栏 343

详解Spring AOP

Aspect Oriented Programming(面向切面编程),OOP是面向对象编程(开发的时候把一个个都抽象成对象来开发),两者的维度不同,处理的事情不同切⾯就是指某⼀类特定问题, 所以AOP也可以理解为⾯向特定⽅法编程。面向切面编程就是针对某一类特定问题统一进行编程比如people类有自己的属性和行为,但是有小一部分人生病要去医院看病,看病这个业务逻辑就不属于哪一个类,因为people泛指所有人,所有人不会都看病。

N_0050的博客 2030

Spring AOP

AOP(Aspect-Oriented Programming,面向切面编程):是一种软件开发的编程范式,旨在将横切关注点(cross-cutting concerns)与核心业务逻辑分离,以提高代码的模块化性、可维护性和复用性

2301_76161469的博客 5338

【Spring Boot】Spring AOP 快速上手指南:开启面向切面编程新旅程

本期主要讲解了关于Spring AOP入门概念,以及快速入门,以及Spring AOP的代码的详细介绍:切点,连接点,通知,以及切面的概念,还有通知类型等其他注解的介绍~~~

GGBond778的博客 5649

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万+

Spring核心思想之IOC和AOP

IoC Inversion of Control (控制反转/反转控制),注意它是⼀个技术思想,不是⼀个技术实现。描述的事情:Java开发领域对象的创建,管理的问题传统开发⽅式:⽐如类A依赖于类B,往往会在类A中new⼀个B的对象IoC思想下开发⽅式:我们不⽤⾃⼰去new对象了,⽽是由IoC容器(Spring框架)去帮助我们实例化对象并且管理它,我们需要使⽤哪个对象,去问IoC容器要即可。我们丧失了⼀个权利(创建、管理对象的权利),得到了⼀个福利(不⽤考虑对象的创建、管理等⼀系列事情)

write less , do more 2939

【Spring】深入解析 Spring AOP 面向切片编程:AOP 思想、AOP 依赖、Spring AOP 实现对类接口进行统一计时功能、Spring AOP & AspectJ 的联系与区别

@Aspect、@Around("execution(* com.bit.book.Controller.*.*(..))")、CGLIB、ProceedingJoinPoint、getSignature、proceed()、Throwable、AspectJ

OuO-1 的博客 1203

Spring - 浅谈AOP思想及Spring的三种实现

前言 Spring的核心思想IoC、DI,及beans、context的XML配置都有了一定的理解 下一个是Spring的又一核心:AOP 什么是AOP AOP:Aspect Oriented Programming,面向切面编程 面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,

key_768的博客 1118

【Spring】Spring AOP

SpringAOP 认识和实现原理

bit me的博客 1949
上一篇: spring的ApplicationContext,事件监听器与国际化消息
下一篇: Spring-AOP更加细化的织入时机
cst_code
博客等级 码龄10年 4粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值