`
零度弥合
  • 浏览: 20615 次
  • 性别: 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. **定义接口**:...

    Java设计模式-代理模式例子

    在Java中,代理模式主要有静态代理和动态代理两种实现方式。 1. 静态代理:在编译时就已经确定了代理类与目标类的关系。通常,代理类会实现和目标类相同的接口,以便于在代理类中调用目标类的方法。这种方式的缺点...

    JAVA设计模式之代理模式实例

    代理模式主要分为静态代理和动态代理两种类型。 1. 静态代理 在静态代理中,代理类和目标类是在编译时就已经确定的,它们通常具有相同的接口。客户端通过代理类调用方法,代理类再转发到目标类。以下是一个简单的...

    JAVA设计模式(java设计)

    Java设计模式是面向对象编程领域中的重要概念,它是一套被广泛接受并实践的解决软件设计问题的经验总结。设计模式并非具体的代码或库,而是一种在特定情境下为了解决常见问题而制定的通用解决方案的描述。它们描述了...

    JAVA设计模式(代理模式)

    **Java设计模式——代理模式详解** 代理模式是软件设计模式中的一个重要组成部分,它在Java编程中扮演着举足轻重的角色。代理模式的核心思想是为一个对象提供一个替身,这个替身即代理对象,代理对象可以控制对原...

    java静态代理、动态代理、装饰设计模式

    Java提供了两种实现代理的主要方式:静态代理和动态代理。 **静态代理** 静态代理是最基础的形式,它需要程序员手动创建一个代理类,该类实现了与目标类相同的接口。代理类持有目标类的引用,并在调用目标类方法...

    Java设计模式-代理模式

    代理模式在Java中有两种常见的实现方式:静态代理和动态代理。静态代理是通过程序员显式创建代理类来实现的,而动态代理则利用Java的反射API在运行时动态创建代理对象。 1. **静态代理**:在静态代理中,我们需要为...

    23种设计模式的实现(Java 版),java设计模式

    7. **适配器模式**:适配器模式是一种结构型设计模式,它能使两个接口不兼容的对象能够协同工作。通过适配器,旧的接口可以适应新的需求,或者不同的系统之间可以互相通信。 8. **组合模式**:组合模式允许我们以...

    用Java实现的代理模式之动态代理

    在Java中,代理模式有静态代理和动态代理两种实现方式。本篇将重点讨论"动态代理",这是一种在运行时创建代理对象的技术,使得我们可以在程序运行过程中,根据需要动态地生成具有额外功能的代理类。 动态代理主要由...

    五种常用的Java设计模式

    工厂模式主要有两种实现方式,第一种方式是使用工厂方法,第二种方式是使用抽象工厂模式。 建造模式 建造模式是一种创建型设计模式,主要目的是解决复杂对象的创建问题。建造模式可以将复杂对象的创建过程分解成多...

    java设计模式视频教程-代理模式.rar

    在这个“java设计模式视频教程-代理模式.rar”压缩包中,包含了一部关于代理模式的视频教程,以及相关的课件和示例代码。 代理模式的核心思想是通过代理类来代理原始对象,为原始对象提供一个替代品或占位符,以...

    java设计模式ppt

    ### Java设计模式详解 在软件开发领域,设计模式是一种被广泛采用的解决方案,用来解决常见的设计问题。设计模式不仅能够帮助开发者写出可复用、可维护的代码,还能提高团队间的沟通效率。以下是对给定文件中提到的...

    java之23种设计模式完整代码

    这里我们探讨的“Java之23种设计模式完整代码”是一份宝贵的资源,它包含了所有23种经典设计模式的实现示例。这份资料能够帮助开发者深入理解每种设计模式的概念、应用场景以及它们之间的差异。 设计模式是经过时间...

    Java两种代理模式案例

    在Java中,代理模式有两种主要实现方式:静态代理和动态代理。下面将详细介绍这两种代理模式,并结合`ProxyDemo`案例进行说明。 ### 1. 静态代理 静态代理是最基础的代理形式,它通过显式创建一个代理类来实现对...

    重学java的设计模式

    Java作为一门广泛应用的开发语言,其设计模式的应用对于提高代码质量、可维护性和可扩展性至关重要。本文将着重探讨创建型模式、结构型模式和行为模式这三大类设计模式,并结合六项设计原则进行深入解析。 首先,...

    java 设计模式试题

    根据提供的文件信息,我们可以归纳并深入探讨以下...适配器模式有两种实现方式:类的适配器和对象的适配器。类的适配器使用继承关系(C),而对象的适配器使用组合/聚合关系。这两种方式都能有效地解决接口不兼容的问题。

    java设计模式(刘伟)

    在《Java设计模式》这本书中,作者刘伟全面地介绍了24种经典的设计模式,并通过丰富的案例和代码示例进行了详细的解析。本书不仅适合初学者作为入门教材,也适合有一定经验的开发人员作为参考书籍来提升自己的设计...

    Java实现动态代理

    在Java中,有两种方式实现动态代理:一种是通过Java的标准库`java.lang.reflect.Proxy`,另一种是使用Java的接口`java.lang.reflect.InvocationHandler`。我们先来看Proxy类,它是Java动态代理的核心,它提供了一种...

    Java 设计模式最佳实践

    在Java中,有静态代理和动态代理两种方式,动态代理通常基于Java的反射机制实现。 八、适配器模式(Adapter) 适配器模式作为两个不兼容接口之间的桥梁,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作...

    java 设计模式之代理模式(Proxy Pattern)实现代码及设计详解:动态代理模式、静态代理模式

    Java设计模式是软件开发中的重要概念,它提供了一套通用的解决方案模板,使得代码更加可复用、可扩展。在这些模式中,代理模式(Proxy Pattern)是一种常用的结构型设计模式,它允许我们为一个对象创建一个代理,该...

Global site tag (gtag.js) - Google Analytics