首先用代码演示一个简单的静态代理实现,程序猿认为代码是最有说服力的。
本例都是基于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的代理模式通过代理类提供了对委托类的扩展和控制,静态代理适合对已有代码不做修改的情况,而动态代理则提供了更高的灵活性和扩展性。在实际应用中,应根据项目需求和性能考虑选择静态代理或动态代理。对于需要...
根据实现方式的不同,代理模式可以分为静态代理和动态代理两种。 ### 静态代理 静态代理是在编译时就已经确定了代理关系。我们需要创建一个代理类,该类实现与目标对象相同的接口,并在代理类的方法中调用目标对象...
本篇我们将深入探讨Spring中的静态代理和动态代理,这两种代理模式在实际开发中都有广泛的应用。 首先,让我们理解什么是代理。代理模式是一种设计模式,它为一个对象提供一个代理以控制对这个对象的访问。在Spring...
本教程将深入探讨静态代理和JDK动态代理的概念、工作原理以及如何实现。 ### 静态代理 静态代理是在编译时就确定了代理类和目标类的关系。代理类和目标类通常都需要实现相同的接口,以便于在代理类中调用目标类的...
在这个“包含静态代理和动态代理demo代码”的压缩包中,我们可能会看到两种常见的Java代理实现方式的示例:静态代理和动态代理。 首先,我们来详细讲解静态代理。在静态代理中,代理类和真实类(目标类)都是在编译...
静态代理和动态代理是两种常见的代理模式,它们在Java中有着广泛的应用,特别是在SpringBoot等框架中。本资源提供了一个简单的Java实现,适用于JDK1.8版本,并经过了验证,对初学者理解设计模式具有指导意义。 静态...
代理设计模式分为静态代理和动态代理两种类型。 ### 静态代理 静态代理是在编译时就已经确定了代理关系,代理类和真实类的关系是硬编码在代理类中的。下面我们将详细介绍静态代理的实现方式: 1. **定义接口**:...
代理模式可以分为两种主要类型:静态代理和动态代理。这两种代理方式各有特点,广泛应用于软件系统中,如权限控制、缓存、事务管理等场景。 **静态代理** 静态代理是最基础的代理形式,代理类和被代理类在编译时就...
代理模式分为静态代理和动态代理两种主要形式,每种都有其特定的应用场景和优势。下面我们将深入探讨这两种代理模式,并通过一个“黄牛买票”的例子来具体说明。 首先,我们来看静态代理。静态代理是程序员在编译时...
Java提供了两种实现代理模式的方式:静态代理和动态代理。 **静态代理** 静态代理是在编译时就已经确定了代理类,通过继承或实现目标接口来创建代理类。以下是一个简单的静态代理实现示例: ```java // 目标接口 ...
总结来说,静态代理和动态代理都是为了在调用对象方法时添加额外的行为,但静态代理需要预先定义代理类,而动态代理可以在运行时动态创建代理对象。在某些场景下,如接口数量多或频繁变动时,动态代理更具优势,因为...
本资源主要涵盖了静态代理和动态代理两种常见类型的代理模式,以及Spring AOP中动态代理的三种配置方式。以下是详细的知识点解析: ### 静态代理 静态代理是程序员手动创建代理类并实现相同接口的方式。代理类和...
Java提供了两种实现代理的主要方式:静态代理和动态代理。 **静态代理** 静态代理是最基础的形式,它需要程序员手动创建一个代理类,该类实现了与目标类相同的接口。代理类持有目标类的引用,并在调用目标类方法...
代理模式通常分为静态代理和动态代理两种类型,这两种代理方式各有特点,适用于不同的场景。 **静态代理** 静态代理是通过程序员手动创建一个代理类来实现的。代理类和真实目标类需要实现相同的接口,以便代理类...
代理模式通常分为静态代理和动态代理两种实现方式,这里我们将详细探讨这两种代理模式,并通过一个简单的Java示例进行演示。 ### 静态代理 静态代理是最基础的代理形式,它的实现主要依靠继承或接口实现。在静态...