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开发中无处不在的设计模式-- ...
随机推荐
- 中国区Windows Azure 提供的功能以及与国外的差异
当前中国服务提供的功能 目前,中国服务中包括以下 Azure 功能. 计算 - 虚拟机(用于 IaaS 服务) 计算 - 云服务(用于 PaaS 服务) 计算 - 网站 数据服务 - 存储(用于 Bl ...
- bss 概念
BSS段 在采用段式内存管理的架构中,BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域.BSS是英文Block Started by Symbol的简称.BSS ...
- passwnger
环境:ubuntu10.04 + nginx + passenger + ruby1.8.7 rails2.3.x #安装nginx(手动编译) $ mkdir -p /home/mouse/opt ...
- How to change pager CSS in CGridView CListView in Yii
类手册: http://www.yiiframework.com/doc/api/1.1/CLinkPager 其它参考: http://capstone3.blogspot.com/2012/06/ ...
- 解决libpython2.6.so.1.0: cannot open shared object file
文章解决的问题:安装nginx中需要Python2.6的支持,下面介绍如何安装Python2.6,并建立lib的连接. 问题展示:error while loading shared librarie ...
- firefox和chrome对于favicon.ico关于content-security-policy的不同处理
1.favicon.ico是网站的title图标 2.在设置CSP时,举例如下,表示只允许来源为https://my.alipay.com的图片,如果不是,则向指定的url(report.php)发出 ...
- XML与XHTML
什么是XML XML的基本格式 XML的定义文档 HTML5的文档定义 XHTML1.0的文档定义 XHTML1.0标记格式 12.1 什么是XML XML中文翻译为可扩展标记语言,顾名思义,它比HT ...
- 使用VisualSVN Server搭建SVN服务器(转载)
转载于http://www.cnblogs.com/greywolf/archive/2013/01/28/2879952.html 使用 VisualSVN Server来实现主要的 SVN功能则要 ...
- JBPM学习(三):管理流程定义
概念: ProcessDefinition,流程定义:一个流程的步骤说明,如一个请假流程.报销流程.是一个规则. ProcessDefinition,流程定义对象,是解析.jpdl.xml文件得到流程 ...
- 最火的Android开源项目(完结篇)
65. AndroidSideMenu AndroidSideMenu能够让你轻而易举地创建侧滑菜单.需要注意的是,该项目自身并不提供任何创建菜单的工具,因此,开发者可以自由创建内部菜单. 66. A ...