spring aop是基于spring IOC容器来管理以及使用了JDK自身的动态代理来实现,程序运行时在被切面前后动态进行的一些逻辑处理。
package com.daosheng.component; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * JDK动态代理的实现 * 实现InvocationHandler接口,重写invoke方法 * @author fanghb * */ public class LogIntercepter implements InvocationHandler{ /** * 声明目标对象也就是被代理对象 */ private Object target; /** * 获得代理对象, * 这个代理对象是由传入的接口类型动态构造出来的一个代理类实例类型, * 这个代理类是JVM在内存中动态构造的动态类 * * tar.getClass().getClassLoader() 代理类加载器需和目标对象类加载器一致 * tar.getClass().getInterfaces() 代理对象需实现目标对象所实现的接口 * this 调用此方法对象本身 * @param tar 被代理对象 * @return */ public Object getProxy(Object tar) { this.target = tar; Object proxy = Proxy.newProxyInstance(tar.getClass().getClassLoader(), tar.getClass().getInterfaces(), this); return proxy; } /** * 此方法在被代理对象的方法被调用之前触发, * 可以对被代理类方法调用的前后进行一些逻辑处理 * * @param proxy 代理对象 * @param method 当前被调用的方法 * @param args 当前被调用的方法参数 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object result = null; before(method);//被代理类方法调用前的逻辑处理 try { result = method.invoke(target, args);//调用被代理类方法 } catch (Exception e) { e.printStackTrace(); } after(method);//被代理类方法调用后的逻辑处理 return result; } /** * 被代理类方法调用前后的逻辑处理 * * @param m 当前被调用的方法 */ public void before(Method method) {//预处理 System.out.println("织入预处理逻辑到" + method.getName() + "方法"); } public void after(Method method) {//后处理 System.out.println("织入后处理逻辑到" + method.getName() + "方法"); } }
测试:
package com.daosheng.service; import com.daosheng.component.LogIntercepter; import com.daosheng.pojo.User; import com.daosheng.service.impl.UserServiceImpl; //测试 public class LogIntercepterTest { public static void main(String[] args) { LogIntercepter log = new LogIntercepter(); UserService proxy = (UserService) log.getProxy(new UserServiceImpl()); User user = new User(); proxy.saveUser(user); System.out.println(); proxy.deleteUser(user); } }
输出:
织入预处理逻辑到saveUser方法 user saved ... 织入后处理逻辑到saveUser方法 织入预处理逻辑到deleteUser方法 user deleted ... 织入后处理逻辑到deleteUser方法
相关推荐
例如,通过使用java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口,我们可以在运行时创建一个代理对象。代理对象在调用方法时会触发InvocationHandler的invoke()方法,从而可以在这个方法中实现...
Java动态代理是Java提供的一种在运行时创建代理对象的技术,它是通过实现InvocationHandler接口和使用Proxy类来实现的。在Spring框架中,AOP(面向切面编程)就是基于Java动态代理来完成的,用于实现横切关注点,如...
在深入理解 Spring AOP 的源码时,需要熟悉 Spring IoC 的工作原理,以及 AOP 相关的概念,如切点表达式、通知类型等。了解这些基础知识可以帮助我们更好地掌握 Spring AOP 的实现细节。在分析源码时,可以参考作者...
现在让我们深入探讨JDK动态代理和Spring AOP的原理。 首先,JDK动态代理基于Java的反射机制,通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。Proxy类用于创建一个代理对象,...
有一天在用回调模版的时候,忽然间又想到jdk自带的Proxy类似乎不是怎么好用,为何不把其做成回调模版呢,可以将其改造称类似spring Aop 代码如下: package com.fjx.proxy.up.test; import ...
本文将深入探讨Spring AOP的实现原理,以及如何使用反射来实现动态代理模式。 首先,我们需要了解AOP的基本概念。AOP的核心思想是切面,它包含两个主要部分:切点(Pointcut)和通知(Advice)。切点定义了在程序...
Spring的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口是实现JDK动态代理的关键。`InvocationHandler`接口定义了一个`invoke`方法,当调用代理对象的方法时,这个方法会被触发,从而执行...
AOP 动态代理(Proxy invocationHandler),Spring的动态代理的介绍
Spring AOP,全称Spring Aspect-Oriented Programming(面向切面编程),是Spring框架的重要组成部分,它提供了一种模块化和声明式的方式来处理系统中的交叉关注点,如日志、事务管理、性能监控等。在Spring AOP中,...
Spring AOP 的底层实现技术 --- Jdk 动态代理原理 JDK 动态代理是 Spring AOP 的底层实现技术,允许开发者在运行期创建接口的代理实例。在 JDK 1.3 以后,JDK 动态代理技术提供了实现 AOP 的绝好底层技术。JDK 动态...
本文将深入解析Spring AOP如何获取代理对象,即Proxy。 首先,我们需要理解AOP的核心概念: 1. **Advice**:通知,是切面实际执行的操作。在Spring中,Advice可以是Before、AfterReturning、AfterThrowing以及...
总的来说,通过Java的动态代理模拟Spring AOP可以帮助我们理解AOP的基本原理,并在实际项目中实现一些简单的切面逻辑。然而,对于更复杂的需求,如跨越多个方法的事务管理,Spring AOP提供了更全面的解决方案。熟悉...
### Spring框架+SpringAOP动态代理 #### 一、Spring AOP 动态代理概述 在探讨Spring AOP(Aspect-Oriented Programming,面向切面编程)中的动态代理之前,我们首先简要回顾一下AOP的基本概念。面向切面编程是一种...
本篇将详细探讨JDK动态代理和Spring AOP,以及它们在实际应用中的作用。 首先,JDK动态代理是Java提供的一种在运行时创建代理对象的技术。它允许我们在不修改原有类的基础上,为已有接口添加额外的功能。动态代理的...
Spring AOP的实现原理包括以下几个关键点: 1. **切面(Aspect)**:切面是AOP的核心,它封装了特定的横切关注点,如日志、事务管理。切面通常由一个或多个通知(advises)组成。 2. **通知(Advice)**:通知是切...
在Spring框架中,AOP(面向切面编程)是一种强大的设计模式,它允许开发者定义“切面”,...通过理解JDK动态代理的工作原理和Spring AOP的相关概念,我们可以更好地利用这一强大功能,提升应用程序的可维护性和灵活性。
通过以上步骤和概念的理解,我们可以更加深入地了解 Spring AOP 的工作原理及其优势。AOP 不仅帮助我们减少了代码重复,提高了代码可读性和可维护性,而且还促进了模块化设计,使应用程序结构更加清晰。
在Spring框架中,AOP(面向切面编程)是一种强大的工具,它允许程序员定义横切关注点,如日志、事务管理、权限检查等,并将它们模块化为可重用的切面。在这个例子中,我们将探讨如何使用动态代理来实现一个简单的...
例如,在`SprigAopJdk`文件中,我们可以看到Spring如何通过`Proxy`类和`InvocationHandler`接口来创建并使用JDK动态代理。 2. CGLIB代理:如果目标对象没有实现接口,或者我们希望对类的方法进行拦截,Spring就会...