理解AOP

谈谈对AOP的认识二——AOP概念术语理解 一、AOP的术语         上篇博客介绍了AOP的由来,及使用aop的便利,在深入了解aop之前,我们当然得先了解一下其众多的概念性术语:         1、 切面(Aspect)     一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子。在Spring AOP中,切面可以使用基于模式或者基于@Aspe 阅读详情

Aspect Oriented Programming  面向切面编程。解耦是程序员编码开发过程中一直追求的。AOP也是为了解耦所诞生。

具体思想是:定义一个切面,在切面的纵向定义处理方法,处理完成之后,回到横向业务流。

AOP 在Spring框架中被作为核心组成部分之一,的确Spring将AOP发挥到很强大的功能。最常见的就是事务控制。工作之余,对于使用的工具,不免需要了解其所以然。学习了一下,写了些程序帮助理解。

AOP 主要是利用代理模式的技术来实现的。

1、静态代理:就是设计模式中的proxy模式

a、业务接口

复制代码
/**
 * 抽象主题角色:声明了真实主题和代理主题的共同接口。
 * 
 * @author yanbin
 * 
 */
public interface ITalk {

    public void talk(String msg);

}
复制代码

b、业务实现

复制代码
/**
 * 真实主题角色:定义真实的对象。
 * 
 * @author yanbin
 * 
 */
public class PeopleTalk implements ITalk {

    public String username;
    public String age;

    public PeopleTalk(String username, String age) {
        this.username = username;
        this.age = age;
    }

    public void talk(String msg) {
        System.out.println(msg + "!你好,我是" + username + ",我年龄是" + age);
    }

    public String getName() {
        return username;
    }

    public void setName(String name) {
        this.username = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

}
复制代码

c、代理对象

复制代码
/**
 * 代理主题角色:内部包含对真实主题的引用,并且提供和真实主题角色相同的接口。
 * 
 * @author yanbin
 * 
 */
public class TalkProxy implements ITalk {

    private ITalk talker;

    public TalkProxy(ITalk talker) {
        // super();
        this.talker = talker;
    }

    public void talk(String msg) {
        talker.talk(msg);
    }

    public void talk(String msg, String singname) {
        talker.talk(msg);
        sing(singname);
    }

    private void sing(String singname) {
        System.out.println("唱歌:" + singname);
    }

}
复制代码

d、测试类

复制代码
/**
 * 代理测试类,使用代理
 *
 * @author yanbin
 * 
 */
public class ProxyPattern {

    public static void main(String[] args) {
        // 不需要执行额外方法的。
        ITalk people = new PeopleTalk("AOP", "18");
        people.talk("No ProXY Test");
        System.out.println("-----------------------------");

        // 需要执行额外方法的(切面)
        TalkProxy talker = new TalkProxy(people);
        talker.talk("ProXY Test", "代理");
    }

}
复制代码

从这段代码可以看出来,代理模式其实就是AOP的雏形。 上端代码中talk(String msg, String singname)是一个切面。在代理类中的sing(singname)方法是个后置处理方法。

这样就实现了,其他的辅助方法和业务方法的解耦。业务不需要专门去调用,而是走到talk方法,顺理成章的调用sing方法

再从这段代码看:1、要实现代理方式,必须要定义接口。2、每个业务类,需要一个代理类。

2、动态代理:jdk1.5中提供,利用反射。实现InvocationHandler接口。

业务接口还是必须得,业务接口,业务类同上。

a、代理类:

复制代码
/**
 * 动态代理类
 * 
 * @author yanbin
 * 
 */
public class DynamicProxy implements InvocationHandler {

    /** 需要代理的目标类 */
    private Object target;

    /**
     * 写法固定,aop专用:绑定委托对象并返回一个代理类
     * 
     * @param delegate
     * @return
     */
    public Object bind(Object target) {
        this.target = target;
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }

    /**
     * @param Object
     *            target:指被代理的对象。
     * @param Method
     *            method:要调用的方法
     * @param Object
     *            [] args:方法调用时所需要的参数
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result = null;
        // 切面之前执行
        System.out.println("切面之前执行");
        // 执行业务
        result = method.invoke(target, args);
        // 切面之后执行
        System.out.println("切面之后执行");
        return result;
    }

}
复制代码

b、测试类

复制代码
/**
 * 测试类
 * 
 * @author yanbin
 * 
 */
public class Test {

    public static void main(String[] args) {
        // 绑定代理,这种方式会在所有的方法都加上切面方法
        ITalk iTalk = (ITalk) new DynamicProxy().bind(new PeopleTalk());
        iTalk.talk("业务说明");
    }
}
复制代码

输出结果会是:

切面之前执行
people talk业务说法
切面之后执行

说明只要在业务调用方法切面之前,是可以动态的加入需要处理的方法。

从代码来看,如果再建立一个业务模块,也只需要一个代理类。ITalk iTalk = (ITalk) new DynamicProxy().bind(new PeopleTalk());  将业务接口和业务类绑定到动态代理类。

但是这种方式:还是需要定义接口。

3、利用cglib

CGLIB是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强。采用的是继承的方式。不细说,看使用

a、业务类

复制代码
/**
 * 业务类
 * 
 * @author yanbin
 * 
 */
public class PeopleTalk {

    public void talk(String msg) {
        System.out.println("people talk" + msg);
    }

}
复制代码

b、cglib代理类

复制代码
/**
 * 使用cglib动态代理
 * 
 * @author yanbin
 * 
 */
public class CglibProxy implements MethodInterceptor {

    private Object target;

    /**
     * 创建代理对象
     * 
     * @param target
     * @return
     */
    public Object getInstance(Object target) {
        this.target = target;
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(this.target.getClass());
        // 回调方法
        enhancer.setCallback(this);
        // 创建代理对象
        return enhancer.create();
    }

    @Override
    public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        Object result = null;
        System.out.println("事物开始");
        result = methodProxy.invokeSuper(proxy, args);
        System.out.println("事物结束");
        return result;
    }

}
复制代码

c.测试类

复制代码
/**
 * 测试类
 * 
 * @author yanbin
 * 
 */
public class Test {

    public static void main(String[] args) {
        PeopleTalk peopleTalk = (PeopleTalk) new CglibProxy().getInstance(new PeopleTalk());
        peopleTalk.talk("业务方法");
        peopleTalk.spreak("业务方法");
    }

}
复制代码

最后输出结果:

事物开始
people talk业务方法
事物结束
事物开始
spreak chinese业务方法
事物结束

由于篇幅有限,这篇主要对AOP的原理简单实现做了演示和阐述,有助自己理解。至于Spring的AOP实现上面无外乎其右,不过实现方面复杂的多。

面试官:谈谈你对IOC和AOP的理解及AOP四种实现方式 IOC控制反转(IOC)是一种设计思想,就是将原本在程序中需要手动创建对象,现在交由Spring管理创建。举个例子,原本我们要在A类中调用B类的方法,就要直接在A中new出B类对象,然后调用B类中的方法,虽然能实现效果,不过存在一个问题,更改需求会对源代码进行修改,这是大忌。现在创建B对象就交给了Spring,在Spring中,B类对象被看成Bean对象(Spring中类就是Bean),这个Bean对象由spring容器进行创建和管理,当我们在配置文件中配置下的AOP。... 阅读详情

相关推荐

Spring Boot AOP从入门到精通:一篇彻底掌握面向切面编程的终极指南

Aspect-Oriented Programming(AOP),面向切面编程,是一种编程范式,它允许开发者通过定义“切面”来模块化横切关注点。AOP通过一种称为“织入”的技术,将这些切面应用到目标对象,从而在不修改源代码的情况下,为程序添加额外的行为。 我的大白话解读:AOP提供了一种全新的“上帝视角”。它让我们能把那些散落在各处的横切关注点(比如日志)代码,从业务方法中“抽”出来,集中到一个地方进行管理。这个“地方”,就叫做切面。 然后,AOP会像一个神奇的“代码织布机”,在程序运行的时候(或者编译

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 2126

设计模式之面向方面(AOP)

简介 AOP(Aspect-OrientedProgramming,面向方面编程),它是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。 OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。 OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日...

大道至简 1918

激光工程师必备:5个ABCDRez在谐振腔设计中的实战技巧(含热效应处理)

本文为激光工程师分享了5个利用ABCDRez矩阵光学工具进行谐振腔设计的实战技巧,重点涵盖热效应处理、模式匹配优化与稳定性分析。通过建立参数化模型、动态热透镜补偿、模式匹配仿真及灵敏度分析,帮助工程师实现从“黑箱”到“白盒”的腔体设计与调试,提升激光器设计的鲁棒性与效率。

k6l7m8n9的博客 706

spring面试复习-0715

spring面试复习-0715

qq_51131591的博客 1039

深入解析SAP MM模块OBYC自动科目分配机制:从T030表到实战配置

本文深入解析SAP MM模块中OBYC自动科目分配机制,阐明其作为连接物流与财务核心桥梁的作用。文章以T030表为核心,详细拆解其字段结构与检索逻辑,并通过采购收货、生产发料等实战场景,手把手演示配置步骤与关键要点,帮助读者掌握从原理到实践的完整知识体系,实现业财无缝对接。

nft7creator的博客 358

详解从无人机倾斜实景三维建模→模型修复→成果网络发布展示分享全流程

1、倾斜实景三维建模软件:CC(Smart3D)软件2、实景三维模型网页在线发布展示、分享平台:图新地球网页端(Wish3D·Earth平台)图新地球网页端(Wish3D·Earth平台)是基于 WebGL技术研发的国产实景三维模型Web端发布展示平台,可实现TB级倾斜实景三维数据快速加载,支持多种格式的三维模型,如OSGB实景模型、OBJ人工模型、SKP人工模型、RVT格式BIM模型等,同时支持模型单体化、三维模型测量分析、水面特效、日照分析等特殊效果呈现,此外也可以根据您的需要进行本地化部署级功能定制。

GISWorld3D的博客 4376

SpringAOP简介

Spring AOP是面向对象变成的意思,AOP和OOP都是一种编程思想。在Spring框架中使用AOP编程,可以减少冗余代码,并解耦业务代码之间的过度的依赖关系。 通常我们会应用在系统的监控,日志处理。 把业务代码中共同使用的模块抽离处理封装成一个模块,这个模块就叫做切面,简化代码。 AOP使用了java设计模式中的代理模式。 ...

Samurai77的博客 673

嵌入式音频架构 - AudioWeaver 整体概念

AudioWeaver 是DSP Concept公司推出的基于嵌入式平台的音频框架。由AWE Core embedded processing engine 和 Audio Weaver Designer IDE 组成。 Audio Weaver Designer 有三个版本,ST Edition, Standard Edtion 和 Pro Edtion。 Audio Weaver Designer界面: Audio Weaver 的整体使用架构: AWD算法流文件,AWS配置脚本文件,AWB嵌入式b

甲客实验室 6877

对AOP的理解

1 AOP面向切面编程基于IoC,是对OOP的有益补充;AOP代表的是一个横向的关系,剖解开封装的对象内部,并将那些影响了 多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即切面。简单地说,就是将那些与业务无关,却为业务模块所共同调用的 逻辑或责任封装起来,比如日志记录,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。 2 Spring实现AOP:J...

weixin_44227923的博客 4022

西门子S7通信协议TSAP配置全攻略:从默认值到自定义修改(附各型号对照表)

本文深入解析西门子S7通信协议中TSAP配置的核心原理与实战方法。针对S7-200/300/400/1200/1500等主流PLC型号,提供了默认TSAP对照表,并详细阐述了如何根据机架号和插槽号计算或自定义Remote TSAP。文章结合常见连接失败案例,给出了系统化的排错流程,旨在帮助工程师快速打通S7通信链路,提升工业自动化现场调试效率。

weixin_29163797的博客 278

科研党必备:用Python+Excel批量下载文献的保姆级教程(附常见错误解决)

本文提供了一套利用Python和Excel实现外文文献批量下载的自动化解决方案。教程详细介绍了如何从数据库导出并清洗DOI信息,编写健壮的Python脚本进行批量下载,并包含错误处理与进阶优化技巧,旨在帮助科研人员将重复性劳动自动化,大幅提升文献收集效率。

weixin_29050513的博客 307

Spring AOP的实现——对AOP的理解

什么是AOP AOP(Aspect Orient Programming,即面向切面编程)。AOP和OOP(Object Orient Programming,面向对象编程)互为补充,面向对象编程将程序分解成各个层次的对象,而面向切面编程将程序运行过程分解成各个切面。可以这么理解:面向对象编程是从静态的角度考虑程序结构,而面向切面编程是从动态的角度考虑程序的运行。 为什么要用AOP

点滴积累 4046

【20】方案管理器

方案管理器是Excel中一个非常强大且灵活的工具,适合用于多情景分析和比较。在复杂的决策过程中,它可以帮助用户快速管理和评估不同变量组合下的结果,从而优化决策过程。

学习,输出==》再学习再输出 1585

Spring AOP理解

Spring AOP基础解读

I_m_j的博客 1732

【问题解决】解决 Python `PermissionError` 权限不足:文件/进程/端口全场景修复

本文总结了Python程序中常见的权限问题及解决方案,包括文件、进程和端口权限错误。文件权限问题通常由文件占用、权限不足或路径错误引起;进程问题多因权限不足或系统限制;端口问题则与端口占用、防火墙或特权端口相关。解决方案提供了详细的代码实现:文件权限管理器类(FilePermissionManager)包含检查权限(check_permission)、修复权限(fix_permission)、安全写入(safe_write)和安全删除(safe_delete)等方法,通过异常处理和临时文件等技术确保操作安全

博客 358

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

说说个人对AOP的理解

AOP做java开发的同学都很熟悉,这是怎样的一个概念,即便用了很久,但在回答对AOP的理解此类问题时,回答的还是不够全面,所以特地做此总结。本篇只做理解,暂不谈论原理。 AOP(Aspect Oriented Programming ) 面向切面编程,也是Spring框架的核心之一,它是一种先进的思想,为解耦而生,作为这种思想的技术支撑离不开动态代理(下篇会进行详细讨论)。可以说是OOP(Ob...

LiHuaxin_BJ的博客 2737

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

aop阻止方法运行_aop简单理解

一、对AOP的初印象首先先给出一段比较专业的术语(来自百度):在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方 式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个 热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑 的各个部分进行隔离,从而使得业务...

weixin_42440389的博客 714

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

AOP的理解

AOP的理解

weixin_41563161的博客 195

初学AOP的一些理解

关于AOP的一些理解 (一)从TestSpring开始说起: 先获取核心业务ProductService的bean创建一个ProductService对象,调用业务中的doSomeService方法,此时可以理解为就在这个方法调用时,发生了中断; (二)接着,讲applicationContext.xml这个文件: ①在aop的config里面第一段的意思是声明了一个切入点(pointcut),这个切入点的id为“loggerCutpoint”; expression属性指定切入点表达式,"* com.h

weixin_44614828的博客 948

原来理解 AOP 可以这么简单

以常见的生活场景:居民用水为例,通俗易懂的理解AOP,一看就会。

杨幂等 482

说说你对AOP的理解

特性JDK动态代理CGLIB动态代理实现基础目标类的接口目标类的子类继承依赖需实现至少一个接口无依赖(可代理任意类)性能调用时反射开销较大生成代理慢,但调用效率高增强限制只能拦截接口方法可拦截所有非final方法AOP 的本质是通过动态代理在运行时“包装”目标对象JDK代理利用接口实现代理,通过插入横切逻辑;CGLIB代理通过继承重写方法,由MethodInterceptor控制增强流程。

tschen的博客 747

通俗理解Spring的IOC和AOP

字面意思通俗理解: 参考Aop理解地址:https://blog.youkuaiyun.com/ios_xumin/article/details/78465782 参考IOC和DI理解地址:https://blog.youkuaiyun.com/lhy55040817/article/details/5335699 具体代码理解:https://www.cnblogs.com/vanl/p/5607534....

有的话没说出来之前,你是他的主人,一旦说出来你就成了他的奴隶||想要干好事,别太把自己当人,别把别人太不当人||认识这个人就是开了一扇窗户,就能看到不一样的东西,听到不一样的声音,能让你思考、觉悟,这已经够了 601

Spring AOP的理解

根据https://blog.youkuaiyun.com/qukaiwei/article/details/50367761 做了一张图,便于自己更好的理解AOP的概念。

zhanjunpeng01的博客 283

对spring aop的理解

今天面试的时候,被问到对aop的理解,正好前几天有看到这个问题,凭着印象回答了下 我:aop用到了动态代理 面试官:动态代理有哪几种,原理是什么 我:动态代理有两种,一种是JDK自带的,一种是cglib 面试官:他们有什么区别 我:JDK自带的动态代理是基于反射实现的,cglib是基于字节码实现的 面试官:还有什么区别 我:我就了解到这了 下面跟大家来详细解释下aop AO...

可惜没如果的博客 852
上一篇: Class.forName
下一篇: 我对AOP的理解
鹿晗的晗
博客等级 码龄16年 22粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值