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开发中无处不在的设计模式-- ...
随机推荐
- 只需三步:使用C# 操作 Azure 队列
Step 1 : 安装windows Azure package Step 2 : 配置文件增加: <appSettings> <add key="StorageConne ...
- Storm系列(二)系统结构及重要概念
在Storm的集群里面有两种节点:控制节点和工作节点,控制节点上面运行Nimbus进程,Nimbus负责在集群里面分配计算任务,并且监控状态.每一个工作节点上面运行Supervisor进程,Super ...
- 浅谈js单例模式
单例模式就是在系统中保存一个实例,就是一个全局变量,在团队开发中,为了实现一些相似的功能,比如不同页面之间的表单验证,可能需求是不一样的,但是呢命名可能一样,这时就会产生冲突,这时候单例模式就能很好的 ...
- Java空字符串与null的区别和判断字符串是否为空的方法
Java空字符串与null的区别: 1.类型null表示的是一个对象的值,而并不是一个字符串.例如声明一个对象的引用,String a = null ;""表示的是一个空字符串,也 ...
- Notepad++中的颜色属性大全
Indent guideline style 缩进参考线的颜色 Brace highlight style 鼠标指针在框架左右时框架的颜色(如css中{} js中的()) Bad brace c ...
- JQuery- 解析JSON数据
我们先以解析上例中的comments对象的JSON数据为例,然后再小结jQuery中解析JSON数据的方法.上例中得到的JSON数据如下,是一个嵌套JSON: {,,"nickname&qu ...
- jsp页面转发到servlet
一个简单的例子来了解一下jsp页面转发到servlet的过程,环境 eclipse.tomcat 1.工程目录结构如下 2.各部分代码如下 1>index.jsp <%@ page lan ...
- Unity3D 导入贴图、模型等资源文件时自动设置参数
脚本继承至AssetPostprocessor, 存放在Editor目录下! using UnityEngine; using System.Collections; using UnityEdito ...
- android开源项目学习
FBReaderJ FBReaderJ用于Android平台的电子书阅读器,它支持多种电子书籍格式包括:oeb.ePub和fb2.此外还支持直接读取zip.tar和gzip等压缩文档. 项目地址:ht ...
- java实现window phone推送通知
package com.windowphone.text; import java.io.IOException;import java.io.OutputStream;import java.net ...