Spring2.5学习4.2_Proxy实现动态代理(目标类实现任意接口)

原创 2015年07月07日 16:18:21

静态代理的缺点是在代理类中绑定了固定的接口,不利于扩展,动态代理则不然,通过动态代理可以对任何实现某一接口的类进行功能性增强。

在java中动态代理由InvocationHander来实现。

HelloInterface接口

[java] view plaincopy
  1. package proxy;  
  2.   
  3. public interface HelloInterface {  
  4.     public void sayHello();  
  5. }  
实现HelloInterface接口的类HelloInterfaceImpl

[java]
 view plaincopy
  1. package proxy;  
  2.   
  3. public class HelloInterfaceImpl implements HelloInterface {  
  4.   
  5.     @Override  
  6.     public void sayHello() {  
  7.         System.out.println("Hello xianjj");  
  8.     }  
  9.   
  10. }  

proTest类实现了InvocationHandler类

package proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
// 实现InvocationHandler接口
public class proTest implements InvocationHandler {

	Object anyObject;
	
	// 申明bind方法
	public Object bind (Object anyObject){
		this.anyObject = anyObject;
		return Proxy.newProxyInstance(anyObject.getClass().getClassLoader(), anyObject.getClass().getInterfaces(), this);
	}
	// 重写invoke方法
	@Override
	public Object invoke(Object arg0, Method arg1, Object[] args)
			throws Throwable {
		Object returnObject = null;
		System.out.println("动态代理开始");
		returnObject = arg1.invoke(anyObject, args);
		System.out.println("动态代理结束");
		return returnObject;
	}

	public static void main(String[] args) {
		proTest proTest = new proTest();
		HelloInterface helloInterfaceReturn = (HelloInterface)proTest.bind(new HelloInterfaceImpl());
		helloInterfaceReturn.sayHello();
	}
}
在main方法中调用proTest对象的bind绑定方法将一个实现类与一个动态代理进行绑定,动态代理主要由以下代码来实现

Proxy.newProxyInstance(anyObject.getClass().getClassLoader(), anyObject.getClass().getInterfaces(), this);
将输入的anyObject对象与接口进行动态关联,这样就可以避免静态接口固定的缺陷了,动态代理由原来的静态代理面向接口转向动态代理面向实现类,这样设计的出发点不是对接口,而是动态的取的接口,软件的灵活性大大的提高。

当调用被代理的HelloInterfaceImpl类实例的方法时,系统将转到包含代理类proTest的InvocationHandler的invoke方法中执行相应的代码,动态代理的过程结束。

public class proTest implements InvocationHandler类不在服务于某一个接口,静态代理和动态代理都是针对于sayHello()方法进行增强,不支持field字段级的增强。Spring认为那已经在破坏面向对象编程的结构,所以支持方法的增强是再合适不的,而且与Spring的其他模块进行整合开发时会更有集中性。



结果:

版权声明:本文为博主原创文章,未经博主允许不得转载。

Spring的两种代理方式:JDK动态代理和CGLIB动态代理

代理模式代理模式的英文叫做Proxy或Surrogate,中文都可译为”代理“,所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象...

最简单的动态代理实例(spring基于接口代理的AOP原理)

JDK的动态代理是基于接口的 package  com.open.aop; public   interface  BusinessInterface  {     public   void  pr...
  • yaohonv
  • yaohonv
  • 2011年07月27日 10:10
  • 1292

Spring动态代理的两种方式

第一种方式:利用JDK的反射机制(proxyJDK) package cn.xhx.jdkproxy; import java.lang.reflect.InvocationHandler; imp...

spring实现AOP的两种方式以及实现动态代理方式

AOP是Aspect Oriented Programing的简称,面向切面编程。AOP适合于那些具有横切逻辑的应用:如性能监测,访问控制,事务管理以及日志记录。AOP将这些分散在各个业务逻辑中的代码...
  • zbuger
  • zbuger
  • 2016年03月30日 09:26
  • 7057

解决Proxy.newProxyInstance创建动态代理导致类型转换错误的问题

在使用Proxy.newProxyInstance创建动态代理时,有时会导致类型转换错误。 package cn.itcast.demo; import java.io.InputStream; ...

java获取request中的参数

1.用request.getParameterMap()获取url中的所有参数 Map map=request.getParameterMap(); Set keSet=map.entryS...
  • jeofey
  • jeofey
  • 2015年06月16日 13:46
  • 676

Spring2.5学习3.3_@Autowire注解实现手动装配

@Autowired默认按类型装配,如果我在personDao 字段上加了@Resource注解,那么就会默认取personDao 字段的类型在Spring容器中寻找与这个类型匹配的bean,寻找到对...
  • jeofey
  • jeofey
  • 2015年06月03日 21:50
  • 903

Spring 2.5 采用动态代理或cglib来实现aop

动态代理,cglib,aop  1)public class JDKProxy implements InvocationHandler {private Object targetObject;//...

Spring AOP实现基础动态代理(Proxy)

1.JDK中实现动态代理的两个关键类:Proxy(Class)和InvocationHandler(Interface)  2.Proxy 提供用于创建动态代理类和实例的静态方法,它还是由这些方法创...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Spring2.5学习4.2_Proxy实现动态代理(目标类实现任意接口)
举报原因:
原因补充:

(最多只允许输入30个字)