public interface IUserDAO { @Transactional String add(); String query(); }
public class UserDAOImpl implements IUserDAO { public String add() { System.out.println("add ok!"); return "add"; } public String query() { System.out.println("query ok!"); return "query"; } }
import org.junit.Test; import org.springframework.transaction.annotation.Transactional; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * Spring事务代理可以分为JDK动态代理和CGLIB代理模式, * JDK动态代理是依赖于接口的, * java.lang.reflect.Proxy.newProxyInstance方法根据传入的接口类型 (obj.getClass.getInterfaces())动态构造一个代理类实例返回, * 这也说明了为什么动态代理实现要求其所代理的对象一定要实现 一个接口。 * 这个代理类实例在内存中是动态构造的,它实现了传入的接口列表中所包含的所有接口。 * * * 就是通过这样一个动态代理对所有需要事务管理的Bean进行加载,并根据配置在invoke方法中对当前调用的 方法名进行判定, * 并在method.invoke方法前后为其加上合适的事务管理代码,这样就实现了Spring式的事务管理。 * Spring中的AOP实 现更为复杂和灵活,不过基本原理是一致的 * Created by kenny.dong on 2018/4/6. */ public class JDKProxyTest { @Test /** * jdk动态代理测试 */ public void jdkProxyTest(){ //01.先创建出接口实现类 final IUserDAO dao=new UserDAOImpl(); //02.类Proxy IUserDAO proxy=(IUserDAO) Proxy.newProxyInstance(dao.getClass().getClassLoader(), //获取实现类的类加载器 dao.getClass(). getInterfaces(), // 获取实现类接口 new InvocationHandler() { //Invocation(调用 ) Handler (处理) /**proxy 代理对象本身 * method 被代理对象 方法 add() * args add方法的参数 */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if(method.getAnnotation(Transactional.class) != null){ System.out.println("start Transaction"); //code 1 //真正业务 //执行dao对象的add方法,传入的是args参数,返回值是result Object result = method.invoke(dao, args); //code 2 System.out.println("commit Transaction"); return result; }else{ return method.invoke(dao, args); } } }); String add = proxy.add(); System.out.println("add 方法运行结果" + add);//"add" proxy.query(); } }
相关推荐
Spring框架是目前Java企业开发中最为流行...总结来说,通过模拟Spring的CGLIB代理,我们可以更深入地理解AOP的实现机制和代理模式的工作原理。这对于加深对Spring框架的理解以及开发高质量的Java应用都是非常有帮助的。
【标题】:“自己动手模拟spring” 【描述】:在该主题中,我们将深入理解Spring框架的核心概念,并通过编码实践来模拟其工作原理。参考链接提供了一个CSDN博客文章,作者详细介绍了如何从零开始创建一个简易版的...
总的来说,通过Java的动态代理模拟Spring AOP可以帮助我们理解AOP的基本原理,并在实际项目中实现一些简单的切面逻辑。然而,对于更复杂的需求,如跨越多个方法的事务管理,Spring AOP提供了更全面的解决方案。熟悉...
- **基于代理的AOP**:Spring使用JDK动态代理或CGLIB动态代理创建目标对象的代理,代理对象在调用目标方法前后执行切面逻辑。 - **基于注解的AOP**:Spring支持在方法上直接定义切面注解,如`@Before`, `@After`, `...
在本主题中,我们将探讨如何使用Java动态代理来模拟实现Spring AOP的功能。 首先,我们需要了解Java中的两种动态代理机制:JDK动态代理和CGLIB动态代理。JDK动态代理基于接口实现,适用于目标对象实现了接口的情况...
本案例"Spring模拟aop静态代理案例"旨在帮助开发者深入理解Spring AOP在实际应用中的运作方式,特别是静态代理的概念。 AOP(Aspect Oriented Programming)是一种编程范式,它允许程序员将关注点(如日志、事务...
不过,需要注意的是,Spring框架提供了更高级的功能,如自动扫描、AOP代理、事务管理等,这些都是纯Java模拟可能难以完全复现的。因此,尽管模拟有助于学习,但在实际项目中,直接使用Spring框架会更加高效和便捷。
**Spring AOP 简单模拟** 在Java开发中,Spring框架因其强大的功能和灵活性而被广泛应用,其中Spring AOP(面向切面编程)是它的重要特性之一。AOP允许程序员将关注点从核心业务逻辑中分离出来,比如日志记录、事务...
Spring AOP通过动态代理机制,在运行时织入切面,提供声明式事务管理等功能。 让我们通过一个简单的例子来模拟Spring的实现。假设我们有一个`UserService`需要依赖`DatabaseService`,在传统模式下,`UserService`...
**模拟Spring AOP技术** Spring AOP(Aspect Oriented Programming,面向切面编程)是Spring框架中的一个重要组件,它提供了一种在不修改源代码的情况下,通过代理模式来实现横切关注点(如日志、事务管理等)的...
然而,实际的Spring框架提供了更高级的功能,如AOP(面向切面编程)、代理模式、基于XML或Java配置的bean定义、条件注解等,使得依赖注入更加灵活和强大。 总的来说,理解和掌握反射与注解对于深入学习Spring框架至...
模拟Spring并不是重新创建一个完整的Spring框架,而是为了学习和理解Spring的工作原理,通过编写简单的代码来实现IOC(Inversion of Control,控制反转)和AOP(Aspect-Oriented Programming,面向切面编程)的核心...
模拟Spring AOP的过程大致如下: 1. **定义目标对象**:这是我们要添加切面逻辑的对象,它通常包含了业务逻辑。 2. **定义切面**:切面定义了我们想要插入到目标对象的行为,如日志记录、事务管理等。 3. **创建...
当我们谈论"Java模拟的spring实现"时,这意味着我们要通过纯Java代码来模拟Spring框架的一些关键特性。这有助于我们深入理解Spring的工作原理,并能在没有Spring环境的情况下进行教学、学习或测试。 首先,让我们来...
本篇文章将探讨如何通过JDK动态代理实现Spring AOP的基础知识。 首先,我们要理解什么是JDK动态代理。在Java中,动态代理机制允许我们在运行时创建一个实现了特定接口的新类。这个新类的实例可以代理目标对象,执行...
在Spring中,AOP通过代理模式实现。我们可以定义切面(Aspect),包含切点(Pointcut)和通知(Advice)。切点是代码执行过程中的特定位置,而通知是在这些位置执行的操作。 例如,我们可以定义一个简单的日志切面...
当Spring无法通过传统的Java代理(JDK Proxy)对无接口类进行代理时,就会转向CGLIB。CGLIB通过创建目标类的子类并覆盖其方法来实现动态代理,即使目标类没有实现任何接口。 首先,我们需要理解Spring拦截器的基本...
4. **AopProxy**:模拟AOP代理,用于在方法调用前后插入拦截逻辑。 5. **Advisor**和**Advice**:模拟Spring的顾问和通知,定义切面的逻辑。 6. **Pointcut**:模拟切点,定义哪些方法或类会被切面所影响。 在这个...
6. **AOP代理**:如果Bean配置了AOP相关的注解,Spring会创建一个代理对象,该代理对象在调用实际Bean的方法前/后执行相应的切面逻辑。 7. **单例Bean的缓存**:对于单例模式的Bean,Spring会将其缓存,后续请求...