参考:http://dyygusi.iteye.com/blog/1997231
参考:http://550516671-qq-com.iteye.com/blog/833816
代理类:
package spring.mock; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class MockSpringAOP implements InvocationHandler { private Object target; public MockSpringAOP(Object obj) { this.target = obj; } public void setTarget(Object target) { this.target = target; } public void before() { System.out.println("这是一个前置通知"); } public void afterReturning() { System.out.println("这是一个后置通知"); } public void afterThrowing() { System.out.println("这是一个异常通知"); } public void after() { System.out.println("这是一个最终通知"); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object returnVal = null; try { before(); returnVal = method.invoke(target, args); afterReturning(); } catch (Exception e) { afterThrowing(); } finally { after(); } return returnVal; } }
代理对象
package spring.mock; public class User { Integer id; String name; String pwd; public User() { } public User(int id, String name, String pwd) { this.id = id; this.name = name; this.pwd = pwd; } } package spring.mock; public interface UserDAO { public void addUser(User user); } package spring.mock; public class UserDAOImpl implements UserDAO { @Override public void addUser(User user) { System.out.println("保存User到数据库中"); throw new RuntimeException(); } }
测试
package spring.mock; import java.lang.reflect.Proxy; public class Test { public static void main(String[] args) { UserDAO userDao = new UserDAOImpl(); MockSpringAOP interceptor = new MockSpringAOP(userDao); // 通过代理的静态方法创建一个代理对象 // 这个代理创建的时候,接收了接口类型和拦截器的处理类,在代理的背后,他会调运拦截器的invoke这个方法。 // 因为传递的有接口类型,所以可以强制类型转换到我们指定的接口类型 UserDAO userDaoProxy = (UserDAO) Proxy.newProxyInstance(interceptor.getClass().getClassLoader(), userDao.getClass().getInterfaces(), interceptor); // 然后在代理对象处理的时候,就会将我的逻辑织如到被代理的对象上 userDaoProxy.addUser(new User(1, "a", "b")); } }
相关推荐
- **基于代理的AOP**:Spring使用JDK动态代理或CGLIB动态代理创建目标对象的代理,代理对象在调用目标方法前后执行切面逻辑。 - **基于注解的AOP**:Spring支持在方法上直接定义切面注解,如`@Before`, `@After`, `...
本篇文章将探讨如何通过JDK动态代理实现Spring AOP的基础知识。 首先,我们要理解什么是JDK动态代理。在Java中,动态代理机制允许我们在运行时创建一个实现了特定接口的新类。这个新类的实例可以代理目标对象,执行...
在本主题中,我们将探讨如何使用Java动态代理来模拟实现Spring AOP的功能。 首先,我们需要了解Java中的两种动态代理机制:JDK动态代理和CGLIB动态代理。JDK动态代理基于接口实现,适用于目标对象实现了接口的情况...
有JDK动态代理和CGLIB代理两种方式,前者针对接口,后者针对类。 接下来,我们将模拟实现Spring AOP: 1. **定义切面**:创建一个类,声明切面并定义通知。例如,我们可以创建一个`LoggingAspect`类,其中包含一个...
Spring支持两种AOP代理:JDK动态代理和CGLIB代理。JDK动态代理适用于接口实现类,而CGLIB代理则用于没有实现接口的类。Spring会根据目标对象是否实现了接口自动选择合适的代理方式。 四、AOP配置 在Spring中,可以...
我们还提供了实际示例,演示如何在Spring AOP中使用JDK动态代理。 CGLib动态代理: 我们将深入研究CGLib动态代理,它允许您在不需要接口的情况下创建代理对象。您将了解CGLib的工作原理,以及如何生成子类来实现...
Spring AOP(面向切面编程)也与此密切相关,它使用动态代理来实现切面的织入,从而提供横切关注点,如日志、事务管理等。现在,我们深入探讨Java动态代理和Spring AOP。 首先,让我们从Java动态代理开始。在Java中...
本案例"Spring模拟aop静态代理案例"旨在帮助开发者深入理解Spring AOP在实际应用中的运作方式,特别是静态代理的概念。 AOP(Aspect Oriented Programming)是一种编程范式,它允许程序员将关注点(如日志、事务...
Spring支持两种代理机制:基于接口的JDK动态代理和基于类的CGLIB代理。 CGLIB(Code Generation Library)是一个强大的高性能代码生成库,其底层是通过使用操作Java字节码的开源字节码操作框架(比如ASM)来实现的...
在实际应用中,动态代理常用于AOP(面向切面编程)场景,例如Spring框架中的AOP代理就是基于JDK动态代理或者CGLIB来实现的,可以在方法调用前、后或异常时插入自定义的行为。 通过上述的静态代理和动态代理的讲解,...
本教程将通过模拟Spring AOP来阐述如何实现一个简单的切面编程。我们将讨论以下几个核心概念:切面、通知、连接点和代理。 首先,我们要理解什么是切面。在AOP中,切面是关注点的模块化,它结合了“横切关注点”...
这种机制在很多场合下都非常有用,比如AOP(面向切面编程)框架如Spring,它们就大量使用了JDK动态代理来实现事务管理、权限控制等功能。总的来说,理解和掌握JDK动态代理是Java开发者必备的技能之一,它能够帮助...
Spring支持两种代理类型:JDK动态代理和CGLIB代理。前者适用于目标对象实现有接口的情况,后者则用于没有接口的目标对象。 在`springboot-aop`这个项目中,你可能会看到以下内容: 1. 定义切面类(Aspect):使用`...
8. **代理模式**:在实现AOP时,我们需要了解和使用代理模式,如JDK动态代理和CGLIB代理,来在运行时创建代理对象以实现切面逻辑。 通过这个模拟过程,我们可以深入理解Spring框架的工作原理,同时也能提升自己的...
Spring AOP通过代理模式实现,可以是JDK动态代理或CGLIB代理,这取决于你的Bean是否实现了接口。 在实际的项目中,使用Eclipse开发工具可以极大地提升效率。在提供的压缩包中,有两个项目——`springIocSimulation`...
在实际项目中,我们常常结合Spring AOP或AspectJ等第三方库来实现更复杂的动态代理功能。这些库提供了更高级的抽象,可以让我们更方便地定义切面和通知。 总的来说,JDK动态代理是Java中一个强大的工具,它让我们的...
《SpringAOP实战示例——基于Spring in action 2ed chapter4》 Spring AOP(面向切面编程)是Spring框架的重要组成部分,它允许我们通过分离关注点来编写更整洁、可维护的代码。在"Spring in action 2nd edition"的...
5. **应用场景**:动态代理常用于AOP(面向切面编程)框架,如Spring AOP,它可以提供一种优雅的方式来添加横切关注点,如日志、事务管理等,而无需修改原始业务代码。此外,动态代理也在测试、数据访问、远程调用等...
Spring支持JDK动态代理和CGLIB代理。 在"TestSpringAOP"这个示例中,我们可能会看到以下内容: 1. **配置文件**:可能包含了对AOP的配置,如启用AOP代理、定义切面和切入点等。在XML配置中,我们可能找到`<aop:...