Java初学者如何迈出AOP第一步--使用Java 动态代理实现AOP

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情
2004年9月28日  作者:wxh1028  Matrix-与Java共舞    
  目前整个开发社区对AOP(Aspect Oriented Programing)推崇备至,也涌现出大量支持AOP的优秀Framework,--Spring, JAC, Jboss AOP 等等。AOP似乎一时之间成了潮流。Java初学者不禁要发出感慨,OOP还没有学通呢,又来AOP。本文不是要在理论上具体阐述何为AOP, 为何要进行AOP . 要详细了解学习AOP可以到它老家http://aosd.net去瞧瞧。这里只是意图通过一个简单的例子向初学者展示一下如何来进行AOP. 

  为了简单起见,例子没有没有使用任何第三方的AOP Framework, 而是利用Java语言本身自带的动态代理功能来实现AOP. 

  让我们先回到AOP本身,AOP主要应用于日志记录,性能统计,安全控制,事务处理等方面。它的主要意图就要将日志记录,性能统计,安全控制等等代码从商业逻辑代码中清楚的划分出来,我们可以把这些行为一个一个单独看作系统所要解决的问题,就是所谓的面向问题的编程(不知将AOP译作面向问题的编程是否欠妥)。通过对这些行为的分离,我们希望可以将它们独立地配置到商业方法中,而要改变这些行为也不需要影响到商业方法代码。 

假设系统由一系列的BusinessObject所完成业务逻辑功能,系统要求在每一次业务逻辑处理时要做日志记录。这里我们略去具体的业务逻辑代码。 

public interface BusinessInterface { 
     
    public void processBusiness(); 


public class BusinessObject implements BusinessInterface { 
     
    private  Logger logger = Logger.getLogger(this.getClass().getName()); 
     
    public void processBusiness(){ 
         
    try { 
         
        logger.info("start to processing..."); 
         
        //business logic here. 
        System.out.println(“here is business logic”);     
     
        logger.info("end processing...");  
    } catch (Exception e){ 
         
        logger.info("exception happends..."); 
        //exception handling 
    }    
    } 


  这里处理商业逻辑的代码和日志记录代码混合在一起,这给日后的维护带来一定的困难,并且也会造成大量的代码重复。完全相同的log代码将出现在系统的每一个BusinessObject中。 

  按照AOP的思想,我们应该把日志记录代码分离出来。要将这些代码分离就涉及到一个问题,我们必须知道商业逻辑代码何时被调用,这样我们好插入日志记录代码。一般来说要截获一个方法,我们可以采用回调方法或者动态代理。动态代理一般要更加灵活一些,目前多数的AOP Framework也大都采用了动态代理来实现。这里我们也采用动态代理作为例子。 

  JDK1.2以后提供了动态代理的支持,程序员通过实现java.lang.reflect.InvocationHandler接口提供一个执行处理器,然后通过java.lang.reflect.Proxy得到一个代理对象,通过这个代理对象来执行商业方法,在商业方法被调用的同时,执行处理器会被自动调用。 

  有了JDK的这种支持,我们所要做的仅仅是提供一个日志处理器。 

public class LogHandler implements InvocationHandler { 
     
    private Logger logger = Logger.getLogger(this.getClass().getName()); 
     
    private Object delegate; 
     
    public LogHandler(Object delegate){ 
        this.delegate = delegate; 
    } 
     
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 
         
        Object o = null; 
        try {             
         
            logger.info("method stats..." + method); 
            o = method.invoke(delegate,args); 
            logger.info("method ends..." + method); 
         
        } catch (Exception e){          
            logger.info("Exception happends..."); 
            //excetpion handling. 
        } 
        return o; 
    } 
     


  现在我们可以把BusinessObject里面的所有日志处理代码全部去掉了。 

public class BusinessObject implements BusinessInterface { 
     
    private  Logger logger = Logger.getLogger(this.getClass().getName()); 
     
    public void processBusiness(){ 
         
        //business processing 
    System.out.println(“here is business logic”);        
    } 


客户端调用商业方法的代码如下, 
BusinessInterface businessImp = new BusinessObject(); 
         
InvocationHandler handler = new LogHandler(businessImp); 
         
BusinessInterface proxy = (BusinessInterface) Proxy.newProxyInstance( 
            businessImp.getClass().getClassLoader(), 
            businessImp.getClass().getInterfaces(), 
            handler); 

proxy.processBusiness(); 

程序输出如下: 
INFO: method stats... 
here is business logic 
INFO: method ends... 

   至此我们的第一次小尝试算是完成了。可以看到,采用AOP之后,日志记录和业务逻辑代码完全分开了 

,以后要改变日志记录的话只需要修改日志记录处理器就行了,而业务对象本身(BusinessObject)无需做任何修改。并且这个日志记录不会造成重复代码了,所有的商业处理对象都可以重用这个日志处理器。 

  
当然在实际应用中,这个例子就显得太粗糙了。由于JDK的动态代理并没有直接支持一次注册多个InvocationHandler,那么我们对业务处理方法既要日志记录又要性能统计时,就需要自己做一些变通了。一般我们可以自己定义一个Handler接口,然后维护一个队列存放所有Handler, 当InvocationHandler被触发的时候我们依次调用自己的Handler。所幸的是目前几乎所有的AOP Framework都对这方面提供了很好的支持.这里推荐大 

家使用Spring(http://www.springframework.org/). 

本人初学AOP,文中不妥之处欢迎大家拍砖。  
参考资源:
参与论坛讨论:http://www.matrix.org.cn/forum.asp
更多技术文章:http://www.matrix.org.cn/article.asp
Matrix java门户:http://www.matrix.org.cn
原文地址:http://www.matrix.org.cn/article/1050.html
任何获得许可转载此文章,须在显著位置标明Matrix的原文地址,并做链接至原文页面,查看详细的版权说明
ezerg 编程小语
细说Spring——AOP详解(动态代理实现AOP 前言 嗯,我应该是有一段实现没有写过博客了,在写完了细说Spring——AOP详解(AOP概览)之后,我发现我不知道该怎么写AOP这一部分,所以就把写博客这件事给放下了,但是这件事情又不想就这么放弃,所以今天我仔细思考了一下,决定还是要克服困难,我仔细的想了一下怎么讲解AOP实现这一部分,然后我决定由浅入深的讲解动态代理,然后用动态代理实现一个简单的AOP,感觉这样能够让人对AOP的原理有一个比... 阅读详情

相关推荐

SpringAOP实现原理——动态代理

原文地址 https://www.cnblogs.com/tuyang1129/p/12878549.html Spring AOP实现原理 SpringAOP实现原理其实很简单,就是通过动态代理实现的。如果我们为Spring的某个bean配置了切面,那么Spring在创建这个bean的时候,实际上创建的是这个bean的一个代理对象,我们后续对bean中方法的调用,实际上调用的是代理类重写的代理方法。而SpringAOP使用了两种动态代理,分别是 JDK动态代理,以及 CGLib 的动态代理

蔡定努 3582

Java AOP的理解与使用

Aspect@Component@Order(1)// 在这里定义切点和通知创建一个类,用@Aspect注解标识为切面,并用@Component将其交由 Spring 容器管理,在切面类中定义切点和通知以及切面逻辑。@Order注解用于指定切面(Aspect)的优先级。当你有多个切面作用于同一个连接点(例如方法调用)时,@Order注解接受一个整数值作为参数,这个值决定了切面的优先级。数字越小,优先级越高,意味着该切面会先于其他具有较大数字的切面执行。如果两个切面具有相同的@Order。

weixin_44711513的博客 1658

JAVA进阶篇教学】第十六篇:JavaAOP使用

AOP(Aspect-Oriented Programming)是一种编程范式,它允许开发者在不修改源代码的情况下,对代码进行横切关注点的分离和增强。在 Java 中,AOP 通常通过使用 Spring Framework 或 AspectJ 等框架来实现AOP 是一种强大的编程范式,它可以帮助开发者将系统级服务从业务逻辑中分离出来,提高代码的可读性、可维护性和可扩展性。在 Java 中,可以使用 Spring Framework 或 AspectJ 等框架来实现 AOP

主要从事JAVA开发,目前是CSDN博客Java领域新星创作者、阿里云博客专家、担任公司研发经理、技术负责人等。热爱编程,喜欢在Python、C、C++领域探索。 1856

Java学习--AOP

Transactional注解:我们一般会在业务层当中来控制事务,因为在业务层当中,一个业务功能可能会包含多个数据访问的操作。SpringAOP底层是基于动态代理技术来实现的,也就是说在程序运行的时候,会自动的基于动态代理技术为目标对象生成一个对应的代理对象。@AfterReturning : 返回后通知,此注解标注的通知方法在目标方法后被执行,有异常不会执行。@After :后置通知,此注解标注的通知方法在目标方法后被执行,无论是否有异常都会执行。

m0_69695971的博客 1021

javaAOP的理解和使用

AOP就是面向切面编程,或者叫面向方面编程,或者开玩笑的说叫面向方便面编程,如果粗俗的理解,就是可以自定义注解,然后通过自己定义的方式定义注解的作用。在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。

weixin_43626529的博客 6256

Java初学者如何迈出AOP第一步--使用Java 动态代理实现AOP(转)

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

kenshin12的专栏 837

Java JDK 动态代理AOP使用实现原理分析

代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息 ​ 一、什么是代理? 二、Java 动态代理类 三、JDK动态代理怎么使用? 四、动态代理怎么实现的? 五、结论 一、什么是代理? 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。 代理模式UML图: 简单结构示意图: 为了保持行为的...

勿忘初心 16万+

JDK动态代理、Cglib动态代理Spring AOP

Java中的JDK动态代理是一种通过反射机制生成代理对象的技术,使得我们能够在运行时动态地创建某个接口的代理类,而无需手动编写实现类。JDK动态代理通常用于横切关注点(如日志、事务管理、安全性等)在方法调用前后进行处理,而不需要修改目标类的源代码。

意疏的博客 6374

Spring AOP动态代理实现方式

"JDK"动态代理和"CGLIB"动态代理 JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。JDK动态代理的核心是InvocationHandler接口和Proxy类 CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成某个类的子类,注意,CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那...

小驴 1万+

Spring AOP动态代理

AOP(Aspect Oriented Programming)意为面向切面编程通过预编译和运行期间动态代理实现程序功能的统一维护的一种技术。是Spring框架里面一个重要的点。它提供了一种将横切关注点(如日志记录、事务管理、安全性等)与业务逻辑分离的机制。AOP 允许开发者将这些关注点模块化,并在不修改业务逻辑代码的情况下,对业务逻辑进行增强。Spring AOP 基于代理机制实现,它可以在运行时动态地创建目标对象的代理对象。

qq_52295468的博客 2445

SpringAOP底层原理(动态代理)-AOP概念及术语 -AOP实现

AOP —— 面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。 是Spring框架中的一个重要内容。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

ebb29bbe的博客 1951

AOP动态代理

目录1.IOC、AOP概念2.为何使用动态代理2.1 JDK原生动态代理 2.1.1 MathService接口类2.1.2 MathServiceImpl实现接口类2.1.3 ProxyFactory动态代理工厂2.1.4 测试类2.2 cglib动态代理 2.2.1 MathServiceImpl类2.2.2 ProxyFactory动态代理工厂2.2.3 测试类3.AOP动态代理3.1 添加对应依赖3.2 配置spring.xml文件3.3 MathService接口类 3.4 MathService

qq_50896786的博客 4946

Spring框架之AOP动态代理底层实现原理

本文摘要: 本章介绍了AOP的基础实现,重点讲解了JDK动态代理Spring中的应用。内容包括: AOP概念与实现方式对比:Spring AOP采用动态代理,而AspectJ基于编译期增强 JDK动态代理核心机制:通过Proxy.newProxyInstance创建代理对象,InvocationHandler实现方法增强 示例代码展示:演示了如何创建代理对象并实现前置/后置增强逻辑 Spring的扩展实现:介绍了ReflectiveMethodInvocation类,该类封装方法调用信息,为拦截器链式调用

几许的博客 1533

AOP如何通过动态代理实现(详细解释)

本文深入解析了AOP(面向切面编程)在Spring框架中的实现原理,重点探讨了动态代理技术的核心机制。文章详细对比了JDK动态代理和CGLIB动态代理的异同:JDK代理基于接口实现,要求目标类必须实现接口;CGLIB则通过继承创建子类代理,适用于普通类。通过代码示例演示了两种代理的具体实现方式,并分析了Spring AOP的智能选择策略——默认优先使用JDK代理,当目标类无接口时自动切换为CGLIB。文章还通过反编译展示了代理类的内部结构,揭示了AOP通过动态代理"包裹"目标对象、实现

2401_83192700的博客 1691

Java动态代理AOP技术详解

1.背景介绍 1. 背景介绍 Java动态代理AOP(Aspect-Oriented Programming)技术是两种非常重要的技术,它们都涉及到代码的重用和模块化。动态代理是一种在运行时创建代理对象的技术,用于实现对象的代理和控制。AOP则是一种以横切点、连接点、通知等概念来实现模块化的技术。 在Java中,动态代理AOP技术都有着广泛的应用。动态代理可以用于实现远程调用、安全控制、...

AI天才研究院 1531
上一篇: 关于阿里巴巴钻入死胡同----再次讨论
下一篇: 如何幸福我们的生活,欢迎大家来讨论!
ezerg
博客等级 码龄25年 13粉丝 106原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值