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 AOP,通过动态代理模拟Spring AOP
NULL 博文链接:https://lochen514.iteye.com/blog/1271194
这是一个基于spring AOP静态代理模拟的案例,可以更好的理解spring的aop作用
spring aop jdk 动态代理的底层实现解析模拟
NULL 博文链接:https://zlx19900228.iteye.com/blog/843289
java 动态代理实现,模拟了spring实现aop的原理,对学习面向切面编程的朋友有帮助!
本资源将深入探讨Spring框架中使用的两种关键的动态代理方式:JDK动态代理和CGLib动态代理。这两种代理方式在Spring AOP中起到关键作用,用于实现横切关注点的切面编程。通过学习它们的原理和实际应用,您将能够更好...
第三课:模拟Spring功能 5 第四课:搭建sping的运行环境 8 一、 建立一个新的项目 8 二、 建立spring的配置文件 8 三、 引入spring的jar包 8 四、 测试代码: 8 五、 注意接口的使用: 8 第五课:IOC(DI)配置及应用 ...
NULL 博文链接:https://johnyi.iteye.com/blog/385443
16.7.2 使用Spring Servlet API模拟对象 16.7.3 使用Spring RestTemplate测试 16.7.4 使用Selenium测试 16.8 小结 第17章 实战案例开发 17.1 论坛案例概述 17.1.1 论坛整体功能结构 17.1.2 论坛用例描述 17.1.3 主要...
由于接口在进行“动态代理” 时仍能保持类型信息,而抽象类可能由于代理的原因导致继承关系的“截断”(如MixIn等)。除此之外,对于单继承的C#语言而言,使用接口可以拥有更大 的弹性。 二、接口依赖 既然类之间的...
2、编写UserDao接口及其实现类UserDaoImpl,要求包含两个模拟方法,分别模拟用户的添加和删除。 3、使用JDK动态代理技术,对目标类UserDaoImpl生成代理类,此时目标类中的方法成为切入点,通过代理技术,将切面类的...
第三课:模拟Spring功能 5 第四课:搭建sping的运行环境 8 一、 建立一个新的项目 8 二、 建立spring的配置文件 8 三、 引入spring的jar包 8 四、 测试代码: 8 五、 注意接口的使用: 8 第五课:IOC(DI)配置及应用 ...
4.3.1为spring切面创建自动代理 4.3.2自动代理@aspectj切面 4.4定义纯粹的pojo切面 4.5注入aspectj切面 4.6小结 第二部分企业spring 第5章使用数据库 5.1spring的数据访问哲学 5.1.1了解spring数据访问的...
4.3.1 为Spring切面创建自动代理 4.3.2 自动代理@AspectJ切面 4.4 定义纯粹的POJO切面 4.5 注入AspectJ切面 4.6 小结 第二部分 企业Spring 第5章 使用数据库 5.1 Spring的数据访问哲学 5.1.1 了解Spring数据...
4.3.1 为Spring切面创建自动代理 4.3.2 自动代理@AspectJ切面 4.4 定义纯粹的POJO切面 4.5 注入AspectJ切面 4.6 小结 第二部分 企业Spring 第5章 使用数据库 5.1 Spring的数据访问哲学 5.1.1 了解Spring数据...
使用Spring的Servlet API代理类 使用IO对象作为入参 其他类型的参数 HttpMessageConverter HttpMessageConverter实现类 使用@RequestBody/@ResponseBody 使用HttpEntity<T>/ResponseEntity<T> 输出XML和JSON 使用...
使用Spring的Servlet API代理类 使用IO对象作为入参 其他类型的参数 HttpMessageConverter HttpMessageConverter实现类 使用@RequestBody/@ResponseBody 使用HttpEntity<T>/ResponseEntity<T> 输出XML和JSON ...
16.7.2 使用Spring Servlet API模拟对象 16.7.3 使用Spring RestTemplate测试 16.7.4 使用Selenium测试 16.8 小结 第17章 实战案例开发 17.1 论坛案例概述 17.1.1 论坛整体功能结构 17.1.2 论坛用例描述 17.1.3 主要...