`

静态代理与动态代理

 
阅读更多
代理设计模式

特征:代理类与委托类(被代理类)有同样的接口,代理类负责消息预处理、把消息转发给委托类,以及事后处理消息等。代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。

代理类可以分为两种:静态代理和动态代理


静态代理例子:

接口
public interface Count {   
    void queryCount();   
    void updateCount();  
委托类
public class CountImpl implements Count {  
  
    @Override  
    public void queryCount() {  
        System.out.println("查看账户方法...");  
  
    }  
  
    @Override  
    public void updateCount() {  
        System.out.println("修改账户方法...");  
  
    }  
代理类
public class CountProxy implements Count {  
    private CountImpl countImpl;  
   
    public CountProxy(CountImpl countImpl) {  
        this.countImpl = countImpl;  
    }  
  
    @Override  
    public void queryCount() {  
        System.out.println("事务处理之前");  
        // 调用委托类的方法;  
        countImpl.queryCount();  
        System.out.println("事务处理之后");  
    }  
  
    @Override  
    public void updateCount() {  
        System.out.println("事务处理之前");  
        // 调用委托类的方法;  
        countImpl.updateCount();  
        System.out.println("事务处理之后");  
  
    }  
  
}  
测试类
public class TestCount {  
    public static void main(String[] args) {  
        CountImpl countImpl = new CountImpl();  
        CountProxy countProxy = new CountProxy(countImpl);  
        countProxy.updateCount();  
        countProxy.queryCount();  
  
    }  
}  
静态代理的特点:
每一个代理类只能为一个接口服务,这样一来程序开发中必然会产生过多的代理,而且,所有的代理操作除了调用的方法不一样之外,其他的操作都一样,则此时肯定是重复代码,解决方法是用动态代理实现。


动态代理的例子:

接口
public interface Shape {
void huat();
}
委托类
public class Circle implements Shape {
@Override
public void huat() {
System.out.println("implement Circle");

}
}

动态代理类
public class InvocationHandlerImpl implements InvocationHandler {


private Object target;

        //构造改对象时,要传入相应的委托类对象
public BookFacadeProxy(Object target){
this.target=target;
}

@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = null;
System.out.println("事物开始");
// method是传入的方法名称,target表示在此对象上调用该方法,args传入该方法的参数
result = method.invoke(target, args);
System.out.println("事物结束");
return result;
}

}

测试类
public class TestProxy {

public static void main(String[] args) {
Circle c=new Circle();
InvocationHandlerImpl invokeImpl=new InvocationHandlerImpl (c);
                //用Proxy类的静态方法,动态地创建代理对象
                //第1个参数表示加载委托类的类加载器,第2个表示委托类实现的接口
                //第3个表示InvocationHandler类型的对象,是实际代理逻辑实现的地方
Shape s=(Shape)Proxy.newProxyInstance(c.getClass().getClassLoader(), c.getClass().getInterfaces(), invokeImpl);
                //在代理对象上调用方法
s.xi();
}

}

可以看到,采用动态代理,不需要为每个接口编写代理类,代理类对象的生成对所有的接口都是通用的,可以传入不同委托类实例,来生成相应的代理对象。但是,它也有缺点,该方法只能代理实现了接口的类。对没有实现接口的类没法代理。

对没有实现接口的类进行代理,我们可以采用cglib开源框架来实现
例子:
委托类
public class BookFacadeImpl1 {
public void addBook() {
System.out.println("增加图书的普通方法...");
}
}

代理类
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class BookFacadeCglib implements MethodInterceptor {
private Object target;

/**
* 创建代理对象
* @param target
* @return
*/
public Object getInstance(Object target) {
this.target = target;
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(this.target.getClass());
// 回调方法
enhancer.setCallback(this);
// 创建代理对象
return enhancer.create();
}

@Override
// 回调方法
public Object intercept(Object obj, Method method, Object[] args,
MethodProxy proxy) throws Throwable {
System.out.println("事物开始");
proxy.invokeSuper(obj, args);
System.out.println("事物结束");
return null;

}

}

测试类
public class TestCglib {
public static void main(String[] args) {
BookFacadeCglib cglib = new BookFacadeCglib();
BookFacadeImpl1 bookCglib = (BookFacadeImpl1) cglib
.getInstance(new BookFacadeImpl1());
bookCglib.addBook();
}
}
分享到:
评论

相关推荐

    java静态代理与动态代理

    ### Java静态代理与动态代理详解 #### 一、代理模式概述 代理模式是软件工程领域中常用的一种设计模式,尤其在Java开发中极为常见。它主要用于控制对某个对象的访问,或者提供额外的功能如日志记录、性能追踪、...

    Java 代理 代理模式 静态代理与动态代理 常见的动态代理实现 .md

    静态代理与动态代理的区别 代理模式可以进一步细分为静态代理和动态代理。 - **静态代理**:在程序编译时就已经确定代理类的具体实现方式。这意味着每次需要代理不同的操作时,都需要修改代理类的代码,这违反了...

    静态代理与动态代理Demo

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

    Java静态代理与动态代理demo

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

    Java静态代理和动态代理

    四、静态代理与动态代理的比较 1. **灵活性**:动态代理比静态代理更灵活,因为不需要预先编写代理类的源代码,可以适应接口的变化。 2. **代码量**:静态代理需要为每个委托类编写单独的代理类,如果委托类很多,会...

    静态代理和动态代理Demo

    总结来说,这个资源提供了一个理解和实践静态代理与动态代理的好例子。通过学习和运行这些代码,你可以深入理解这两种代理模式的工作原理,以及如何在实际项目中应用它们。同时,这也有助于提升你对Java反射机制的...

    静态代理与动态代理小Demo

    一个静态代理和动态代理的小例子,开发时使用的工具是myeclipse,直接使用myeclipse工具导入即可,希望能 给大家理解这方面的入门知识带来些作用,同时也希望大家指出不足,我可以更加进行改进

    JAVA静态代理和动态代理

    静态代理是程序员手动创建代理类并实现与目标对象相同的接口。代理类和目标类都必须实现相同的接口,这样代理类就可以在调用目标对象方法的同时添加额外的功能。以下是一个简单的静态代理模式示例: 1. 定义接口: ...

    静态代理和动态代理

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

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

    与静态代理相比,动态代理更灵活,它在运行时动态地创建代理类。Java中的动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。动态代理的步骤如下: 1. 定义一个接口...

    Spring的静态代理和动态代理

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

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

    总结来说,静态代理在编译时就需要明确代理类与目标类的关系,而动态代理则在运行时动态创建代理类,更灵活但需要实现`InvocationHandler`接口。两者都可以用于在调用目标方法前后插入额外的逻辑,根据具体需求选择...

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

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

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

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

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

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

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

    静态代理是通过在源代码中创建一个代理类来实现的,这个代理类与真实对象(被代理的对象)有相同的接口。代理类在调用实际对象的方法时,可以添加额外的逻辑。以下是一个简单的静态代理示例: ```java // 接口 ...

Global site tag (gtag.js) - Google Analytics