Java学习:动态代理的一点小理解

手动实现

之前的一篇讲IoC的博文提到了代理模式,事实上代理模式就是AOP实现的重要基石。但是上面的代码有一个显而易见的缺陷,也就是之前讲解反射内容时提到的:不具备动态性

上面代码中的Server就像是反射理解博文中提到的工厂订单管理员一样,每增加一样菜系,就需要相应更新手上的菜单。类比反射特性,我们完全可以做到让服务员不需要手上拿着菜单来为顾客服务:

// 服务员实现类
public class ServerImpl implements Server {

    // 采用组合的方式引入noodles
    private Noodles noodles;

    @Override
    public void getNoodles() {
        // 代理模式
        noodles.getNoodles();
    }

    // 利用反射特性
    @Override
    public void setNoodles(String noodles) {
        this.noodles = (Noodles) Class.forName(noodles).newInstance();
        }
    }
}

API实现

之前的动态代理是我们手动实现的,JDK其实自带了很多实现动态代理的类和方法。可能初次接触时会显得有些复杂,所以先画一张图来表示我们整个的设计思路:

之前在讨论IoC举的餐馆用例中,除了不具备动态性之外还有一个缺陷:服务员只服务于本餐馆,也就是说,我们能不能把服务员这个群体抽离出来,不仅服务这个餐馆,也能服务于多家餐馆,以实现代码的复用呢?

现实生活中有一种类型的公司,叫做家政公司,我们可以类比来编写一个服务员工厂:

public class ServerFactory implements InvocationHandler {

    private Object target;
    // 设定服务对象
    public void setTarget(Object target) {
        this.target = target;
    }

    // 返回具体的服务团队
    public Object getServer() {
        return Proxy.newProxyInstance(
                this.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }

    @Override
    // 这一部分代码暂时忽略不管
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        return method.invoke(target, args);
    }
}

这是利用java.lang.reflect包提供的动态代理相关类和方法编写的ServerFactory。最后的invoke方法是继承接口要求的重写方法,不妨碍我们理解,暂时忽略,主要关注前半部分的代码。

前半部分代码非常好理解:

  1. 工厂接到业务需求:给某某提供服务。派出服务团队
  2. 利用setTarget确定服务对象。
  3. 使用getServer返回对应的服务人员。

下面使用这个类进行测试,同样以与餐馆厨师对接为例:

public class ServerTest {
    public static void main(String[] args) {
        // 获取服务员团队
        ServerFactory serverGroup = new ServerFactory();
        // 设定该团队对接面食厨师
        serverGroup.setCooker(new NoodleCooker());
        // 获取单个服务员
        Cooker server = (Cooker) serverGroup.getServer();
        // 顾客点餐
        server.cooking();
    }
}

// NoodleCooker类
public class NoodleCooker implements Cooker {

    @Override
    public void cooking() {
        System.out.println("开始下面了!");
    }
}

// Cooker接口
public interface Cooker {
    void cooking();
}

我们实现了服务员和餐馆之间的解耦。有了服务员工厂,可以给任意的客户提供专业服务团队(setTarget),并且为每一次服务需求提供单个服务员进行实现(getServer)。

原文地址:https://www.cnblogs.com/acct-zcw/p/12340635.html

时间: 2024-08-29 12:50:52

Java学习:动态代理的一点小理解的相关文章

java的动态代理机制详解

在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于 Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的我们的功能,我们更需要学习的是其底层是怎么样的一个原理,而AOP的原理就是 java的动态代理机制,所以本篇随笔就是对java的动态机制进行一个回顾. 在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface).另一个则是 Proxy(Cla

代理模式 & Java原生动态代理技术 & CGLib动态代理技术

第一部分.代理模式  代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务.(其实就是在代理类中关联一个委托类的实例,然后在代理类中进行包装). UML图如下: 第二部分.在Java中实现代理模式  按照代理的创建时期,代理类可以分

[转载] java的动态代理机制详解

转载自http://www.cnblogs.com/xiaoluo501395377/p/3383130.html 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务. 按照代理的创建时期,代理类可以分为两种. 静态代理

设计模式(二)学习----动态代理

动态代理:动态代理是指在实现阶段不需要关心代理谁,而在运行阶段才指定代理哪一个对象.Spring AOP采用的核心思想就是动态代理设计模式.  下面看动态代理的UML类图: 下面思考问题:invocationHandler的invoke方法是由谁来调用的,代理对象是怎么生成的? 动态代理类: package com.lp.ecjtu.DynamicProxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect

Java使用动态代理实现AOP

参考资料: http://www.importnew.com/15420.htmlhttp://www.cnblogs.com/techyc/p/3455950.html Spring是借助了动态代理(JDK dynamic proxy)和CGlib两种技术实现AOP的,本文将学习前人的例子使用动态代理模拟AOP的特性. 1. 环境 Java: jdk1.8.0_144 2. 学习动态代理Proxy.newProxyInstance()方法 它的三个参数如下 参数名 类型 说明 loader C

Java特性-动态代理

代理在开发中无处不在: 我们完成一个接口开发A,接口下有很多个实现类,这些类有些共同要处理的部分,比如每一个类都定义了接口A中的方法getXX(String name).我现在想把每次调用某个实现类的getXX方法时传的参数name记录在数据库某个表里,可问题是,,我们总不能在每个实现类里面去添加一个这样的处理模块吧?工作量太大了,把该处理逻辑写到一个static的工具类里面,然后每个实现类再去调用也挺麻烦.况且这个处理是给改接口专门使用的,放在工具类里也不合适啊.. 好办,我再写一个实现接口A

java中动态代理实现机制

JAVA各种动态代理实现的比较 接口 interface AddInterface{ int add(int a, int b); } interface SubInterface{ int sub(int a, int b); } 实现类 class Arithmetic implements AddInterface, SubInterface{ @Override public int sub(int a, int b) { return a-b; } @Override public i

Java基础-动态代理

在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface).另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的. InvocationHandler 每一个动态代理类都必须要实现InvocationHandler这个接口,并且每个代理类的实例都关联到了一个handler,当我们通过代理对象调用一个方法的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的 invoke 方法来进行调用

(转)java的动态代理机制详解

原文出自:http://www.cnblogs.com/xiaoluo501395377/p/3383130.html 在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的我们的功能,我们更需要学习的是其底层是怎么样的一个原理,而AOP的原理就是java的动态代理机制,所以本篇随笔就是对java的动态机制进行一个回顾. 在java的动态代理机制中,有