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