`
fish_no7
  • 浏览: 28014 次
文章分类
社区版块
存档分类
最新评论

关于静态代理和动态代理

 
阅读更多
首先用代码演示一个简单的静态代理实现,程序猿认为代码是最有说服力的。
本例都是基于JDK的动态代理,有关cglib的代理,这里没有介绍,不过大同小异。

一.静态代理
1.首先创建一个实体类:User

public class User {

private String username;
private String email;

public String getUsername() {
return username;
}

public void setUsername(String username) {
this.username = username;
}

public String getEmail() {
return email;
}

public void setEmail(String email) {
this.email = email;
}

}

2.定义一个接口IUserDAO
public interface IUserDAO {
    public void saveUser(User user);
    public void findUserByUsername(String username);
}

3.定义一个接口的实现类
public class UserDAO implements IUserDAO{

	@Override
	public void saveUser(User user) {
		// TODO Auto-generated method stub
		System.out.println("save user now ;");
	}

	@Override
	public void findUserByUsername(String username) {
		// TODO Auto-generated method stub
		System.out.println("find user now ;");
	}
    
}
[/java]
4.定义一个静态代理类
public class UserDAOProxy implements IUserDAO{
	/**
	 * 静态代理类
	 */
    private IUserDAO userDAO ;
    
    public UserDAOProxy(IUserDAO userDAO){
    	this.userDAO = userDAO;
    }
	@Override
	public void saveUser(User user) {
		// TODO Auto-generated method stub
		System.out.println("save user before ;");
		userDAO.saveUser(user);	
	}
	@Override
	public void findUserByUsername(String username) {
		// TODO Auto-generated method stub
		System.out.println("find user now ;");
	}
    
}

5.一个测试类
public class UserDAOTest {
    public static void  main(String args[]){
    	User user = new User();
    	IUserDAO userDAO = new UserDAO();
    	UserDAOProxy userDAOProxy = new UserDAOProxy(userDAO);
    	userDAOProxy.saveUser(user);
    }
}

执行结果:

save user before ;
save user now ;

二.动态代理
1.定义代理类

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 动态代理类
 * 
 * @author 
 * 
 */
public class UserDAODynamicProxy implements InvocationHandler {
	private Object originalObject;

	public Object bind(Object obj) {
		this.originalObject = obj;
		/* Proxy类是专门完成代理的操作类,可以通过此类为一个或多个接口动态地生成实现类,此类提供了如下的操作方法 */
		return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj
				.getClass().getInterfaces(), this);
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {// 在代理实例上处理方法调用并返回结果。在与方法关联的代理实例上调用方法时,将在调用处理程序上调用此方法
		Object result = null;
		if (method.getName().startsWith("save")) {
			System.out.println("开始执行save操作");
			result = method.invoke(originalObject, args);
			return result;
		} else if (method.getName().startsWith("find")) {
			System.out.println("开始执行find操作");
			result = method.invoke(originalObject, args);
			return result;
		} else {
			// TODO Auto-generated method stub
			return null;
		}
	}
}

2.写一个测试类:
class UserDAODynProxyTest {
	public static void main(String args[]) {
		User user = new User();
		String username = "";
		UserDAODynamicProxy userDAODynamicProxy = new UserDAODynamicProxy();
		IUserDAO userDAO = (IUserDAO) userDAODynamicProxy.bind(new UserDAO());// 绑定代理目标
		userDAO.saveUser(user);
		userDAO.findUserByUsername(username);
	}
}

3.执行结果:

开始执行save操作
save user now ;
开始执行find操作
find user now ;

分享到:
评论

相关推荐

    JAVA静态代理和动态代理

    Java提供了两种主要的代理实现方式:静态代理和动态代理。 **静态代理** 静态代理是程序员手动创建代理类并实现与目标对象相同的接口。代理类和目标类都必须实现相同的接口,这样代理类就可以在调用目标对象方法的...

    Java静态代理和动态代理

    Java的代理模式通过代理类提供了对委托类的扩展和控制,静态代理适合对已有代码不做修改的情况,而动态代理则提供了更高的灵活性和扩展性。在实际应用中,应根据项目需求和性能考虑选择静态代理或动态代理。对于需要...

    静态代理和动态代理

    根据实现方式的不同,代理模式可以分为静态代理和动态代理两种。 ### 静态代理 静态代理是在编译时就已经确定了代理关系。我们需要创建一个代理类,该类实现与目标对象相同的接口,并在代理类的方法中调用目标对象...

    Spring的静态代理和动态代理

    本篇我们将深入探讨Spring中的静态代理和动态代理,这两种代理模式在实际开发中都有广泛的应用。 首先,让我们理解什么是代理。代理模式是一种设计模式,它为一个对象提供一个代理以控制对这个对象的访问。在Spring...

    静态代理和动态代理的讲解和案例,有详细的注释

    本教程将深入探讨静态代理和JDK动态代理的概念、工作原理以及如何实现。 ### 静态代理 静态代理是在编译时就确定了代理类和目标类的关系。代理类和目标类通常都需要实现相同的接口,以便于在代理类中调用目标类的...

    包含静态代理和动态代理demo代码

    在这个“包含静态代理和动态代理demo代码”的压缩包中,我们可能会看到两种常见的Java代理实现方式的示例:静态代理和动态代理。 首先,我们来详细讲解静态代理。在静态代理中,代理类和真实类(目标类)都是在编译...

    静态代理和动态代理Demo

    静态代理和动态代理是两种常见的代理模式,它们在Java中有着广泛的应用,特别是在SpringBoot等框架中。本资源提供了一个简单的Java实现,适用于JDK1.8版本,并经过了验证,对初学者理解设计模式具有指导意义。 静态...

    Java设计模式——代理设计模式(静态代理和动态代理)

    代理设计模式分为静态代理和动态代理两种类型。 ### 静态代理 静态代理是在编译时就已经确定了代理关系,代理类和真实类的关系是硬编码在代理类中的。下面我们将详细介绍静态代理的实现方式: 1. **定义接口**:...

    静态代理和动态代理的例子

    代理模式可以分为两种主要类型:静态代理和动态代理。这两种代理方式各有特点,广泛应用于软件系统中,如权限控制、缓存、事务管理等场景。 **静态代理** 静态代理是最基础的代理形式,代理类和被代理类在编译时就...

    静态代理与动态代理Demo

    代理模式分为静态代理和动态代理两种主要形式,每种都有其特定的应用场景和优势。下面我们将深入探讨这两种代理模式,并通过一个“黄牛买票”的例子来具体说明。 首先,我们来看静态代理。静态代理是程序员在编译时...

    Java静态代理与动态代理demo

    Java提供了两种实现代理模式的方式:静态代理和动态代理。 **静态代理** 静态代理是在编译时就已经确定了代理类,通过继承或实现目标接口来创建代理类。以下是一个简单的静态代理实现示例: ```java // 目标接口 ...

    静态代理和动态代理简单实现代码

    总结来说,静态代理和动态代理都是为了在调用对象方法时添加额外的行为,但静态代理需要预先定义代理类,而动态代理可以在运行时动态创建代理对象。在某些场景下,如接口数量多或频繁变动时,动态代理更具优势,因为...

    代理设计模式:静态代理和动态代理的理解、实现与区别(优缺点)与SpringAOP的3种配置方式案例工程代码

    本资源主要涵盖了静态代理和动态代理两种常见类型的代理模式,以及Spring AOP中动态代理的三种配置方式。以下是详细的知识点解析: ### 静态代理 静态代理是程序员手动创建代理类并实现相同接口的方式。代理类和...

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

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

    java 静态代理和动态代理学习实例源码

    代理模式通常分为静态代理和动态代理两种类型,这两种代理方式各有特点,适用于不同的场景。 **静态代理** 静态代理是通过程序员手动创建一个代理类来实现的。代理类和真实目标类需要实现相同的接口,以便代理类...

    动态代理和静态代理demo

    代理模式通常分为静态代理和动态代理两种实现方式,这里我们将详细探讨这两种代理模式,并通过一个简单的Java示例进行演示。 ### 静态代理 静态代理是最基础的代理形式,它的实现主要依靠继承或接口实现。在静态...

Global site tag (gtag.js) - Google Analytics