使用Java实现AOP

【JAVA基础】AOP详解 AOP(Aspect OrientedProgramming):面向切面编程,面向切面编程(也叫面向方面编程),是目前软件开发中的一个热点,也是Spring框架中的一个重要内容。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 阅读详情

使用Java来实现AOP的功能,主要介绍两种实现方法

  1. Proxy代理方法
  2. CGLib方法

1.Proxy代理

采用Proxy类方法,其基本流程为:主函数-->代理-->目标对象
对于Proxy类有一个使用前提:目标对象必须要实现接口
利用Proxy实现AOP的主要步骤如下:
  1. 创建接口
  2. 创建接口实现类
  3. 创建代理工厂类
接下来我们使用示例来演示
需求:学生类具有姓名属性,并具有空参数的构造函数和带参数的构造函数,获取学生的姓名属性并打印。
但是假如学生没有姓名属性的话获取学生姓名会返回Null值,为了避免这种情况的发生我们就得使用AOP的编程技巧来对getName方法进行增强。

首先我们创建一个接口StudengInterface
public interface StudentInterface {
    public void print();
}

接口中只有一个方法:print
接下来创建接口实现类StudentBean
public class StudentBean implements StudentInterface{
    private String name;
    public StudentBean() {
    }
    public StudentBean(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void print() {
        System.out.println("Hello World!");
    }
}
类中具有一个String类型的属性name,并包含一个空参数的构造函数和带参数的构造函数。
接下来创建代理工厂类ProxyFactory
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyFactory implements InvocationHandler{
    private Object stu;

    /**
    * 创建目标对象的实体类
    * @param stu 目标对象
    * @return 目标对象实体类
    */
    public Object createStudentProxy(Object stu){
        this.stu=stu;
        //返回目标对象实体类,第一个参数目标对象的类加载器,第二个参数是目标对象的接口对象,
        // 第三个参数是InvocationHandler默认对象。此方法会回调invoke方法
        return Proxy.newProxyInstance(stu.getClass().getClassLoader(),stu.getClass().getInterfaces(),this);

    }

    /**
    * 处理业务逻辑:
    * 当Student存在名字则直接打印“Hello World”
    * 将如Student的名称为空,则输出相关的信息。如“名称为空,代理类已经拦截”等,
    * 表明代理类已经起作用了。
    */
    public Object invoke(Object proxy, Method method, Object[] args) throws InvocationTargetException, IllegalAccessException {
        StudentBean s= (StudentBean) stu;
        Object object=null;
        if (s.getName()!=null){
            object=method.invoke(stu,args);
        }else {
            System.out.println("名称为空,代理类已经拦截");
        }
        return object;
    }
}
创建对应入口类来测试代理是否生效
public class Main {
    public static void main(String[] args){
        StudentInterface s1=new StudentBean();
//        StudentInterface s1=new StudentBean("wang");
        ProxyFactory factory=new ProxyFactory();
        StudentInterface s2= (StudentInterface) factory.createStudentProxy(s1);
        s2.print();
    }
}
可以看到有名称的StudentBean和没有名称的StudentBean分别输出了对应的信息。
利用Proxy实现AOP功能的总结如下:
  1. 目标对象必须实现接口
  2. 返回创建的代理对象
  3. 重写接口的invoke()方法
  4. 限制条件放在invoke()方法中
2.CGLib方法
CGlib简述

           Cglib (Code Generation Library) 是一个优秀的动态代理框架, 他是一个强大的,高性能的,高质量的Code生成类库,他可以在运行期扩展Java类与实现Java接口。 它的底层使用ASM在内存中动态的生成被代理类的子类,使用CGLIB即使代理类没有实现任何接口也可以实现动态代理功能。CGLIB具有简单易用的特点,它的运行速度要远远快于JDK的Proxy动态代理。
使用CGLIB需要导入以下两个jar文件:
  • asm.jar – CGLIB的底层实现
  • cglib.jar – CGLIB的核心jar包。

CGLIB的核心类:

  •     net.sf.cglib.proxy.Enhancer – 主要的增强类
  •     net.sf.cglib.proxy.MethodInterceptor – 主要的方法拦截类,它是Callback接口的子接口,需要用户实现
  •     net.sf.cglib.proxy.MethodProxy – JDK的Java.lang.reflect.Method类的代理类,可以方便的实现对源对象方法的调用,如使用:Object o = methodProxy.invokeSuper(proxy, args);//虽然第一个参数是被代理对象,也不会出现死循环的问题。
实现AOP功能步骤如下所示:
  1. 引入相关jar文件
  2. 创建实体类
  3. 创建CGLib代理类
  4. 创建入口类进行测试
示例如下:
相关的jar包以及在创建Spring工程的时候已经加载到项目中去了,
需求和上面的一样
首先创建一个学生类StudentBean
public class StudentBean{
    private String name;

    public StudentBean() {
    }

    public StudentBean(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

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

    public void print() {
        System.out.println("Hello World!");
    }
}

接下来创建对应的CGLib代理工厂类CGLibProxyFactory

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

/**
* cglib代理工厂类
* 注意实现的接口类是cglib包下的MethodInterceptor
*/
public class CGLibProxyFactory implements MethodInterceptor {
    private Object object;
    /**
    * 创建代理类对象
    * @param object 被代理对象
    * @return 代理类对象
    */
    public  Object createStudent(Object object){
        this.object=object;
        //利用Enhancer来创建代理类
        Enhancer enhancer=new Enhancer();
        //为目标对象指定父类
        enhancer.setSuperclass(object.getClass());
        //设置回调函数
        enhancer.setCallback(this);
        //返回生成的代理类
        return enhancer.create();
    }

    /**
    * 业务处理逻辑代码
    * 利用到了java的反射
    * @param o
    * @param method
    * @param objects
    * @param methodProxy
    * @return 代理类对象
    * @throws Throwable
    */
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        StudentBean student=(StudentBean)object;
        Object result=null;
        if (student.getName()!=null){
            methodProxy.invoke(object,objects);//利用反射来执行相应的方法
        }else{
            System.out.println("该方法已被拦截!");
        }
        return result;
    }
}

创建对应的入口类来测试
public class Main {
    public static void main(String[] args){
        StudentBean student1
                = (StudentBean) new CGLibProxyFactory().createStudent(new StudentBean());
        StudentBean student2
                = (StudentBean) new CGLibProxyFactory().createStudent(new StudentBean("wang"));
        student1.print();
        student2.print();
    }
}
可以看到输出结果为:
该方法已被拦截!
Hello World!

总结:
可以看到Proxy代理方法和CGLib方法实现AOP的步骤基本相同,主要区别是:
使用Proxy代理类,他创建出来的目标对象和代理对象都必须实现相同的接口。
而CGLib方法则是直接代理目标对象,不需要实现同一接口。



Java Spring AOP 实现原理 Spring Aop的实现原理 AOP(Aspect Orient Programming),我们一般称为面向方面(切面)编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理、日志、缓存等等。AOP实现的关键在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ;而动态代理则以Spring AOP为代表。本文会分别对...... 阅读详情

相关推荐

使用Java原生代理实现AOP

本文由博主柒。原创,转载请注明出处完整源码下载地址 https://github.com/MatrixSeven/JavaAOP一说到AOP,大家一定会想到Spring,因为这东西实在是太强大了.但是大家一定要清楚,AOP是一只编程思想,而Spring仅仅是AOP的一种实现罢了. 首先百度下: 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预

Accelerator的博客 921

JAVA aop 实现的几种方式,以及原理解析

编写自定义切面类System.out.println("方法执行前");System.out.println("方法执行后");在beans.xml中配置测试类不变,再次执行结果:方法执行前添加了一个用户方法执行后。

qq_39355721的博客 4132

JAVA代码使用SpringBoot AOP实现操作系统日志

这两天做了个系统日志管理功能,现在来总结一下。项目中用到AOP主要是将日志记录从业务逻辑代码中划分出来,减少冗余代码和重复工作步骤...废话有点多 首先创建操作系统日志表,表结构如下: 1.创建操作日志注解类Log.java package com.daqing.financial.hrauth.annotation; import com.daqing.financial.hrauth.enums.OperationType; import com.daqing.financial.hra

Qyq0498的博客 553

Spring源码学习(3) —— CglibAopProxy实现AOP

前面我们解读了jkd动态代理方式实现aop的源码,今天我们重点来看下cglib方式实现aop的原理。与JdkDynamicAopProxy一样,CglibAopProxy实现了AopProxy接口,主要是需要用到其getProxy方法来生成代理对象。 1.生成代理对象 getProxy()方法核心逻辑如下: public Object getProxy(ClassLoader cla...

蔡小兵的博客 2159

华为S5700三层交换机VLAN配置避坑指南:为什么你的VLAN间无法互通?

本文针对华为S5700三层交换机VLAN间无法互通的典型故障,提供深度排障指南。文章从数据转发原理入手,系统梳理了从物理链路、VLAN配置、VLANIF接口状态、路由表到ARP表、MTU及安全策略等全链路检查点,并给出了清晰的排查命令与流程,帮助网络工程师快速定位并解决VLAN间路由问题,实现稳定互通。

tt34567的博客 870

【FnOS飞牛云 | NAS存储】旧电脑不吃灰,手把手教你搭建完全属于自己的私人网盘

打造属于自己的NAS私人网盘,亲测有效,值得一试

木子Linux的博客世界 9408

Java中的AOP是什么?如何实现AOP

通过动态代理,应用程序可以在不修改其原始代码的情况下,将横切关注点从主要逻辑中分离出来,从而实现更高的可重用性和可维护性。通过使用AOP,开发人员可以更轻松地实现应用程序的横切关注点,从而提高应用程序的可重用性和可维护性,并且更好地管理和组织代码。AOP是一种编程范式,它使开发人员能够在不改变应用程序原有逻辑的情况下,将横切关注点(例如日志记录、事务管理、安全性等)从应用程序的主要逻辑中分离出来。总之,AOP是一种非常有用的软件设计模式,它可以帮助我们更好地管理和组织代码,从而提高软件的质量和可维护性

2301_77769537的博客 2189

Qlib上手学习记录

Qlib 是一个面向人工智能的量化投资平台,其目标是通过在量化投资中运用AI技术来发掘潜力、赋能研究并创造价值,从探索投资策略到实现产品化部署。该平台支持多种机器学习建模范式,包括有监督学习、市场动态建模以及强化学习等。真的是走了很多弯路step 1. 使用 ananconda 建立环境,要主要必须是 python 3.8失败的下了以后 进入 glib folder 后执行是会报错的,不管你还什么source 都一样,整了很久使用前最好看下这个。

chenchihwen的专栏 3099

Java-SpringBoot AOP-半小时了解AOP知识及使用注解实现AOP

springboot 2.7.0 jdk 8AOP (Aspect Orient Programming),直译过来就是 面向切面编程,AOP 是一种编程思想,是面向对象编程(OOP)的一种补充。 面向切面编程,实现在不修改源代码的情况下给程序动态统一添加额外功能的一种技术。 AOP可以拦截指定的方法并且对方法增强,而且无需侵入到业务代码中,使业务与非业务处理逻辑分离,比如Spring的事务,通过事务的注解配置,Spring会自动在业务方法中开启、提交业务,并且在业务处理失败时,执行相应的回滚策略。Spri

草青工作室 的专栏 836

基于Python的MOOC课程评价爬取与分析系统设计与实现

本文详细介绍了如何使用Python最新技术栈构建一个高效的MOOC课程评价爬取与分析系统。系统采用Scrapy框架结合Selenium实现动态页面抓取,利用PyMySQL进行数据存储,并通过Pandas和Matplotlib实现数据可视化分析。文章从爬虫原理、技术选型、系统设计到代码实现进行全面讲解,为教育工作者改进教学质量提供数据支持。关键词:Python爬虫、MOOC评价分析、Scrapy框架、数据可视化、教学改进。

2201_76125261的博客 1103

Centos 7 Linux 安装单机 Hadoop(HDFS):下载、安装、配置、测试

本文详细介绍了在 CentOS 7 系统上安装与配置单机 Hadoop(HDFS)的完整流程,涵盖 JDK 环境准备、Hadoop 安装包下载与部署、核心配置文件(core-site.xml、hdfs-site.xml 等)修改、SSH 免密登录设置、HDFS 格式化及服务启动,并通过命令行与 Web 界面验证 HDFS 和 YARN 功能,适合 Hadoop 初学者快速搭建本地测试环境。

寒水馨 · 轻量级技术文档 · hanshuixin.org 3233

使用Java的代理模式实现AOP编程

使用Java的代理模式可以实现面向切面编程(AOP)。可以看到,通过代理模式,我们在实际的服务方法执行前后添加了额外的逻辑,实现了面向切面编程(AOP)的效果。// 创建代理对象,将实际的服务对象传入代理构造函数。// 在添加用户之前执行额外的逻辑。// 在添加用户之后执行额外的逻辑。// 在删除用户之前执行额外的逻辑。// 在删除用户之后执行额外的逻辑。// 调用实际的服务方法。// 调用实际的服务方法。// 创建实际的服务对象。// 调用代理对象的方法。

m0_75198698的博客 277

【数据集】中国各类水文专业常用数据集合集

对中国各类水文专业常用数据集进行整理并总结

WW、forever的博客 9295

Java使用aop+反射实现自定义注解

什么是注解 注解用来给类声明附加额外信息,可以标注在类、字段、方法等上面,编译器、JVM以及开发人员等都可以通过反射拿到注解信息,进而做一些相关处理 常用注解 @Override 只能标注在子类覆盖父类的方法上面,有提示的作用 @Deprecated 标注在过时的方法或类上面,有提示的作用 @SuppressWarnings(“unchecked”) 标注在编译器认为有问题的类、方法等上面,用来取消编译器的警告提示,警告类型有serial、unchecked、unused、all

weixin_43700943的博客 875

【电源专题】案例:对比不同电池在不同电流下的电池放电曲线

无

一点硬件 2840

YOLOv11涨点改进 | 全网创新首发、主干改进篇 | CVPR 2025 | RAVLT主干让 YOLOv11 更加强大!通过增强线性注意力机制,特别在小目标和复杂背景的检测上表现突出

本文提出RAVLT主干网络,通过改进YOLOv11的空间特征建模能力,显著提升小物体和复杂背景检测性能。RAVLT采用秩增强线性注意力(RALA)机制,在保持线性计算复杂度的同时解决传统线性注意力低秩问题。RALA通过增强KV缓冲区和输出特征矩阵的秩,提高特征多样性和建模能力。实验表明,RAVLT在ImageNet-1k上达到84.4% Top-1准确率,仅需2600万参数和4.6GFLOPs,性能优于现有线性注意力模型。文章详细介绍了RAVLT模块结构、实现原理及在YOLOv11中的集成方法,包含四种主干

Ai缝合怪、助力小伙伴高效发论文 634

Java使用aop实现日志功能

在Java中,使用AOP(面向切面编程)来记录日志是一种常见且高效的方法。以下是一个详细的步骤指南,展示了如何在Java项目中使用Spring AOP来记录日志。

milk_yan的博客 1214

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

java asm工具类_使用ASM实现简单的AOP

前言之前一直使用greys及其内部升级二次开发版来排查问题。最近周末刚好事情不多,作为一名程序员本能地想要弄懂这么神奇的greys到底是怎么实现的?周末从github上拉了代码仔细读了读,其基本技术框架是JVM attach + Instrumentation + asm实现的。关于JVM attach和Instrumentation的功能,下次再写文章介绍,本文着重于greys中非常神奇的一个类...

weixin_39779004的博客 442

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

IDEA的使用指南

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

Java使用AOP和XML实现日志记录

Java通过AOP和XML实现日志记录

qq_48885166的博客 376

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

使用ASM操作Java字节码,实现AOP原理

本文通过一个的例子来实现:使用ASM动态生成Java字节码文件(.class) 或者 加载字节码后动态修改字节码,添加我们需要执行的代码。年底了,也没心情抠字了,把写demo包含的几个类代码直接贴出来吧,代码拷贝下来后可以直接使用,不会有什么其他错误。 使用 asm-5.0.3.jar demo工程的package为com.shanhy.demo.asm.hello5个Java文件: AopC

小单的博客专栏 2万+

Java Spring框架中使用AOP实现日志

使用@Pointcut定义了两个切入点,分别匹配controller和service包下的所有方法。- 对于Controller方法,额外记录请求URL、HTTP方法和IP地址。- com.example.controller包及其子包。- 对于Controller方法,额外记录HTTP请求信息。2. 配置切入点表达式(指定哪些方法需要记录日志)- 记录了方法名、参数、返回结果、执行时间。- 可以获取方法执行前、执行后的信息。- 计算并记录方法执行时间。- 记录方法抛出的异常信息。

weixin_42696208的博客 264

Java使用aop实现操作日志

1、设计数据表-- ---------------------------- -- Table structure for t_log -- ---------------------------- DROP TABLE IF EXISTS `t_log`; CREATE TABLE `t_log` ( `id` int(11) NOT NULL auto_increment COMMENT ...

qq_37980469的博客 1424

使用Java 动态代理实现AOP

 目前整个开发社区对AOP(Aspect OrientedPrograming)推崇备至,也涌现出大量支持AOP的优秀Framework,--Spring, JAC, Jboss AOP等等。AOP似乎一时之间成了潮流。Java初学者不禁要发出感慨,OOP还没有学通呢,又来AOP。本文不是要在理论上具体阐述何为AOP,为何要进行AOP . 要详细了解学习AOP可以到它老家http://

溺水的鱼 - Later equals never. 742

每天学点Java之使用AspectJ实现AOP

使用AspectJ实现AOP 1.首先什么是AspectJ AspectJ是使用面向切面的一个框架 它扩展了Java语言(它本身也是一种语言) 支持原生Java代码 有自己的编译器 将代码翻译成Java字节码文件 是为了方便编写AOP代码而出现的 使用AOP编程的三个重点 通知 切点 织入 2.使用AspectJ实现AOP方式一: xml配置完成AOP (1.创建通...

Java 3379

Java使用动态代理实现AOP

参考资料: http://www.importnew.com/15420.htmlhttp://www.cnblogs.com/techyc/p/3455950.html Spring是借助了动态代理(JDK dynamic proxy)和CGlib两种技术实现AOP的,本文将学习前人的例子使用动态代理模拟AOP的特性。 1. 环境 Java:jdk1.8.0_144 2. 学习动态代...

weixin_30407613的博客 82
上一篇: AOP-面向切面的编程
下一篇: Spring学习(二十四)Spring实现AOP
wangxin1248
博客等级 码龄11年 305粉丝 68原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值