`
零度弥合
  • 浏览: 19266 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

【java设计模式】两种方法java实现动态代理

 
阅读更多

来自视频教程的笔记http://wenku.baidu.com/course/view/192a0066f5335a8102d22000?cid=5

 

代理模式顾名思义,有一个代理类,一个被代理的目标对象,代理类可以在目标类的方法前后做一些事情。

实际上,一旦配置完毕,目标类的所有方法前后都会做那些事情。

 

我用自己的话总结一下,别喷。

 

有两种方法 一种是java反射机制,另一种效率比较好,采用cglib,后者也是spring AOP采用的技术。

 

直接上例子

 一个接口,不一定是dao举例子而已 

 

public interface StudentDao {
	public void saveStudent();
	public void queryStudent();
}

 一个实现以上接口的类。

 

 

public class StudentDaoImpl implements StudentDao {

	@Override
	public void saveStudent() {
		System.out.println("保存学生资料。。。。");
	}

	@Override
	public void queryStudent() {
		System.out.println("查询学生资料。。。。");
	}

}

 

 

 代理 类

public class DAOProxy implements InvocationHandler {

	private Object originalObject;
 
	public Object bind(Object obj) {
		this.originalObject = obj;
		return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj
				.getClass().getInterfaces(), this);
	}

	void preMethod() {
		System.out.println("----执行方法之前----");
	}

	void afterMethod() {
		System.out.println("----执行方法之后----");
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		Object result = null;
		preMethod();
		result = method.invoke(this.originalObject, args);
		afterMethod();
		return result;
	}

}

 

 

 ##

代理类继承了java.lang.reflect.InvocationHandler;

bind这个方法绑定代理对象和目标对象,其中:Proxy.newProxyInstance接收三个参数,①类加载器②目标对象实现的所有接口③代理对象本身

bind方法把目标对象拿到,绑定好,又作为返回值传递回来,所以绑定之后的目标对象是增加了代理功能后的了

第二个参数是接口,所以,用java反射机制实现动态代理,那目标对象一定要实现接口

 

 invoke方法也接收三个参数:①代理对象②要用代理的方法③这个方法的参数

我之前只学过基础java反射,知道这是反射的方法,只是多了一个代理对象

 

测试类如下

 

public class TestDaoProxy extends TestCase {
	public void testDaoProxy(){
		StudentDao studentDao = new StudentDaoImpl();
		DAOProxy daoProxy=new DAOProxy();
		studentDao = (StudentDao)daoProxy.bind(studentDao);
		studentDao.queryStudent();
	}
}
 

 

换成目标类中的另一个方法也是通用的。

 

 

下面是第二中方法,第二中方法使用cglib技术,需要jar包,jar包在spring的依赖包中有,3.0已经继承进主jar包,2.5有单独的jar包

cglib和前一个方法的不同是没有接口也可以

 目标类如下

 

public class StudentDao {
	public void saveStudent() {
		System.out.println("保存学生资料。。。。");
	}

	public void queryStudent() {
		System.out.println("查询学生资料。。。。");
	}
}
 

 

 代理类如下

 

public class DAOCglibProxy implements MethodInterceptor {

	private Object originalObject;

	public Object bind(Object obj) {
		this.originalObject = obj;
		Enhancer enhancer = new Enhancer();
		enhancer.setSuperclass(obj.getClass());
		enhancer.setCallback(this);
		return enhancer.create();
	}

	void preMethod() {
		System.out.println("----执行方法之前----");
	}

	void afterMethod() {
		System.out.println("----执行方法之后----");
	}

	@Override
	public Object intercept(Object obj, Method method, Object[] args,
			MethodProxy proxy) throws Throwable {
		preMethod();
		Object result = proxy.invokeSuper(obj, args);
		afterMethod();
		return result;
	}

}
 

 

 测试方法如下

 

	public void testDAOCglibProxy() {
		StudentDao studentsDao = new StudentDao();
		DAOCglibProxy proxy = new DAOCglibProxy();
		studentsDao = (StudentDao) proxy.bind(studentsDao);
		studentsDao.queryStudent();
	}
 

 

cglib实际上是通过继承出一个子类实现的代理。可以把Enhancer看做那个子类的生成器 ,所以在bind方法中,指定父类,然后绑定好代理对象就可以了

指定父类:enhancer.setSuperclass(obj.getClass());

绑定代理方法:enhancer.setCallback(this);

然后返回创建好的已经加了代理的目标对象:return enhancer.create();

在测试类中使用的时候很简单,只要绑定好,然后执行就行。

 

可见还是cglib这个方法更方便,而且据说效率最高。所以spring采用之。

 

分享到:
评论

相关推荐

    java设计模式

    目录: 前 言 第一部分 大旗不挥,谁敢冲锋——热身篇 第1章 单一职责原则 1.1 我是“牛”类,我可以担任多职吗 1.2 绝杀技,打破你的传统思维 1.3 我单纯,所以我快乐 1.4 最佳实践 ...附录:23个设计模式

    Java23种设计模式可直接运行Demo

    设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 ...

    java常用23中设计模式

    总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元...

    利用Java的反射与代理实现IOC模式

    而代理是一种基本的设计模式,它是一种为了提供额外的或不同的操作而插入到真 实对象中的某个对象。而Java的动态代理在代理上更进一步,既能动态的创建代理对象,又能动态的调用代理 方法。Java的反射和动态代理机制...

    23种JAVA设计模式和15种J2EE设计模式

    设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 ...

    JAVA设计模式之行为模式

    这是JAVA设计模式中属于行为模式的部分,包括Template(模板模式)、Chain of Responsibility(责任链模式)、Memento(纪念品模式)、Mediator(中介模式)、Strategy(策略模式)、State 、Observer(观察者模式)、Visitor...

    设计模式(JAVA语言实现)--20种设计模式附带源码PPT模板.pptx

    2桥接模式:定义一个接口、两个类都实现该接口桥接模式:定义一个接口、两个类都实现该接口 设计模式(JAVA语言实现)--20种设计模式附带源码PPT模板全文共22页,当前为第3页。 logo 3组合模式:整体-部分,比如...

    java种设计模式详解

    详细描述了java设计模式种23种模式,其中包括,创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、...

    设计模式之合成模式Java实现和类设计图

    设计模式之合成模式的Java实现版本,包括UML类设计图,包含了两种实现,安全式和透明式

    应用示例-Java设计模式及应用案例(第2版)-[共11页].pdf

    180 Java 设计模式及应用案例(第 2 版) public CellContext2(String strPhone, String name, float price){ this.strPhone = strPhone; this.name = name; this.price = price; } public int getMark(){ int mark ...

    23种设计模式java源码

    设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 ...

    极客学院java-23种设计模式

    极客学院java设计模式,课程源码,这是我辛苦收集的,本站有的要3个分,我两个就行,附赠研磨设计模式电子书,嘻嘻

    java静态代理和动态代理详解

    Java中的代理是一种常见的设计模式,它可以帮助我们在不改变原有代码逻辑的情况下,对现有对象进行增强或扩展。在代理模式中,主要有两种类型:静态代理和动态代理。 1.静态代理: 静态代理是指在编译期间就已经确定...

    Java+单例+多例+工厂+枚举+动态代理===》演示

    根据实例化对象的时机单例设计模式又分为以下两种: 1. 饿汉单例设计模式 2. 懒汉单例设计模式 多例设计模式案例演示 #### 多例设计模式的作用 多例模式,是一种常用的软件设计模式。通过多例模式可以保证系统中,...

    JAVA23种设计模式及快捷记忆

    设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。工厂模式、抽象工厂模式、...

    JAVA设计模式23种

    23种设计模式 创建模式 设计模式之Singleton(单态/单件) 阎宏博士讲解:单例(Singleton)模式 保证一个类只有一个实例,并提供一个访问它的全局访问点 设计模式之Factory(工厂方法和抽象工厂) 使用工厂模式就象使用 ...

    java 常用设计模式chm

    设计模式中定义: 为其他对象提供一种代理以控制对这个对象的访问. 为什么要使用Proxy? 1.授权机制 不同级别的用户对同一对象拥有不同的访问权利,如Jive论坛系统中,就使用Proxy进行授权机制控制,访问论坛有两种人:...

    Java设计模式

    简单易懂的java 设计模式文档,对23种设计模式举例讲解:总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式,共七种:适配器模式、装饰器...

    经典Java23种设计模式.rar

    设计模式就是在工作中经常遇到的一类问题的解决方案,是一种解决问题的方法,更是一种思想,是智慧的结晶。 设计模式是对被用来在特定场景下解决一般设计问题的类和相互通信的对象的描述。 Java的23种设计模式 构成...

    JAVA设计模式的工厂模式文档和代码

    普科国际软件一个学院的学习笔记,有3个文件word文档,文本,还有factory-demo源文件代码

Global site tag (gtag.js) - Google Analytics