16_AOP入门准备_动态代理模式
【工程截图】
【PersonDao.java】
package com.HigginCui.daoProxy; //目标类接口
public interface PersonDao {
public void savePerson();
}
【PersonDaoImpl.java】
package com.HigginCui.daoProxy; //目标类
public class PersonDaoImpl implements PersonDao{
@Override
public void savePerson() {
System.out.println("save Person...");
}
}
【Transaction.java】
package com.HigginCui.daoProxy; public class Transaction {
public void beginTransaction(){
System.out.println("begin transaction...");
}
public void commit(){
System.out.println("begin commit...");
}
}
【personDaoInterceptor.java】
package com.HigginCui.daoProxy; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; //拦截器
public class PersonDaoInterceptor implements InvocationHandler{
private Object target;
private Transaction transaction; //构造函数
public PersonDaoInterceptor(Object target,Transaction transaction){
this.target=target;
this.transaction=transaction;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
//1.开启事务
this.transaction.beginTransaction();
//2.进行savePerson操作
method.invoke(target, args); //目标方法调用方法
//3.提交事务
this.transaction.commit();
return null;
} }
【testPerson.java】
package com.HigginCui.test; import java.lang.reflect.Proxy;
import org.junit.Test;
import com.HigginCui.daoProxy.PersonDao;
import com.HigginCui.daoProxy.PersonDaoImpl;
import com.HigginCui.daoProxy.PersonDaoInterceptor;
import com.HigginCui.daoProxy.Transaction; public class testPerson {
@Test
public void test(){
Object target=new PersonDaoImpl();
Transaction transaction=new Transaction();
//创建一个拦截器
PersonDaoInterceptor interceptor=new PersonDaoInterceptor(target,transaction);
/*
* Proxy.newProxyInstance(loader, interfaces, h)方法
* 参数1:loader,目标类的类加载器
* 参数2:interfaces,目标类实现的所有的接口
* 参数3:h,拦截器,即上面创建的拦截器
*/
PersonDao personDao=(PersonDao) Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
interceptor);
personDao.savePerson();
}
}
【运行结果】
begin transaction...
save Person...
begin commit...
【拦截器中的invoke方法什么时候执行?】
答:当在客户端的代理对象调用方法的时候,进入到了invoke方法。
【拦截器中的invoke方法中的method参数什么时候传递的值?】
答:当在客户端的代理对象调用方法的时候,进入到了invoke方法,这个时候,method参数就是代理对象调用的方法。
【代理对象的方法体的内容是什么?】
答:代理对象的方法体的内容就是invoke方法体的内容。
代理对象的方法体:
1.开启事务
2.目标方法
3.事务的提交
4.代理对象的方法体就是把事务和目标方法结合在一起了,这样做的目的就是为了让目标类的目标方法和事务的方法松耦合。
16_AOP入门准备_动态代理模式的更多相关文章
- 16_AOP入门准备_Jdk动态代理模式
[工程截图] [PersonDao.java] package com.HigginCui.daoProxy; //目标类接口 public interface PersonDao { public ...
- 15_AOP入门准备_静态代理模式
[工程截图] [PersonDao.java] package com.HigginCui.daoProxy; public interface PersonDao { public void sav ...
- JAVA动态代理模式(从现实生活角度理解代码原理)
所谓动态代理,即通过代理类:Proxy的代理,接口和实现类之间可以不直接发生联系,而可以在运行期(Runtime)实现动态关联. java动态代理主要是使用java.lang.reflect包中的两个 ...
- Java-马士兵动态代理模式
Java-马士兵动态代理模式 模拟jdk的动态代理的实现原理, 这些东西没有必要写出来,写项目的时候一般用不上,主要是为了面试和理解原理: java动态代理有什么作用 作用非常大,在很多底层框架中都会 ...
- Java静态代理与动态代理模式的实现
前言: 在现实生活中,考虑以下的场景:小王打算要去租房,他相中了一个房子,准备去找房东洽谈相关事宜.但是房东他很忙,平时上班没时间,总找不到时间去找他,他也没办法.后来,房东想了一个办法,他找到 ...
- java jdk动态代理模式举例浅析
代理模式概述 代理模式是为了提供额外或不同的操作,而插入的用来替代”实际”对象的对象,这些操作涉及到与”实际”对象的通信,因此代理通常充当中间人角色. java中常用的动态代理模式为jdk动态代理和c ...
- 设计模式之jdk动态代理模式、责任链模式-java实现
设计模式之JDK动态代理模式.责任链模式 需求场景 当我们的代码中的类随着业务量的增大而不断增大仿佛没有尽头时,我们可以考虑使用动态代理设计模式,代理类的代码量被固定下来,不会随着业务量的增大而增大. ...
- iOS的动态代理模式的实现
动态代理模式的应用很多,特别是在不能修改被代理类的前提下,要对执行某些方法时需要打log或者捕捉异常等处理时,是一个非常方便的方法.只需要少量修改客户端(场景类)代码和添加一个代理类就可以实现,这个符 ...
- Android开发中无处不在的设计模式——动态代理模式
继续更新设计模式系列.写这个模式的主要原因是近期看到了动态代理的代码. 先来回想一下前5个模式: - Android开发中无处不在的设计模式--单例模式 - Android开发中无处不在的设计模式-- ...
随机推荐
- Storm系列(五)架构分析之Nimbus启动过程
启动流程图 mk-assignments 功能:对当前集群中所有Topology进行新一轮的任务调度. 实现源码路径: \apache-storm-0.9.4\storm-core\src\clj ...
- 【Java基础】Java中的多态
什么是多态 多态是一个对象的多种实现,是建立在继承的基础上的,即对象“人”,有老师和学生不同的实现,其实总结起来就是允许将子类类型的指针赋值给父类类型的指针. 多态的发生条件 多态发生的前提是:1. ...
- POJ-2442 Sequence K路归并问题
题目链接:http://poj.org/problem?id=2442 问题一:K个有序表合成一个有序表,元素共有n个.用堆优化 问题二:两个序列的前n小的元素.堆优化. 这题就是问题二的扩展,每次处 ...
- 查看Linux下*.a库文件中文件、函数、变量
查看Linux下*.a库文件中文件.函数.变量等情况在Linux 下经常需要链接一些 *.a的库文件,那怎么查看这些*.a 中包 含哪些文件.函数.变量: 1. 查看文件:ar -t xxx.a 2. ...
- Topology拓扑
- 教程-Delphi操作快捷键
************************************************************** Delphi快捷键-全-高手用-南山古桃(新手)-同学共进 ******* ...
- hdu 1754 I Hate It (splay tree伸展树)
hdu 1754 I Hate It 其实我只是来存一下我的splay模板的..请大牛们多多指教 #include<stdio.h> #include<string.h> #i ...
- 库不存在的排查方法:ImportError: No module named selenium2Library
解决办法: 把selenium2Library改成Selenium2Library 安装下面四个: python-2.7.13.amd64.msi robotframework-ride-1.5. ...
- 一步一步学android控件(之十六)—— CheckBox
根据使用场景不同,有时候使用系统默认的CheckBox样式就可以了,但是有时候就需要自定义CheckBox的样式.今天主要学习如何自定义CheckBox样式.在CheckBox状态改变时有时需要做一些 ...
- JavaScript高级程序设计—阅读笔记(第一部分)
第一章 JavaScript简介1.JavaScript组成(核心(ECMAScript),文档对象模型(DOM),浏览器对象模型(BOM))2.文档对象模型(DOM),提供访问和操作网页内容的方法和 ...