关于静态代理和动态代理

首先用代码演示一个简单的静态代理实现,程序猿认为代码是最有说服力的。
本例都是基于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 ;

猜你喜欢

转载自fish-no7.iteye.com/blog/1721776