Java中的动态代理与静态代理

  created  by  鱼鱼 {{tag}}
创建于 2019年08月02日 19:16:57 最后修改于 2019年08月09日 17:58:42

Java中的动态代理与静态代理

Java中的动态代理与静态代理

        proxy(代理)作为一种设计模式在Java中已经应用非常广泛,例如常见的拦截器是代理模式设计的,AOP是通过动态代理实现的,而基于AOP的应用就更多了,从简单的事务应用到Dubbo框架,Java开发中离不开代理,本篇文章主要阐述Java中的代理,此处是比较狭义的代理,仅指方法和类中的代理。

代理模式

        代理模式是一种非常常见的设计模式,它通过给某对象提供代理,从而通过代理对象控制原对象的引用。

简单实现

        以下是代理模式的简单实现:

        类Admin:

public class Admin{
    public void changeWorld(){
        //doSomeThing
    }
}

        对应的代理类AdminProxy:

public class AdminProxy extends Admin{
    @Override
    public void changeWorld(){
        //doSomething
        super.changeWorld();
        //doSomething
    }
}

    设计良好的聚合代理模式应该是代理类与被代理类共同继承一个接口,此处只为实现功能。

    这样在执行new AdminProxy().changeWorld()时,除了会调用原本的new Admin().changeWorld(),在方法前后也可以做出些其他的操作。

静态代理

        以上的代理模式的例子就属于静态代理,静态代理的特点是编译阶段便已经明确要代理的对象,将其代理片段直接织入字节码文件中。对应地,动态代理的对象可能是不确定的,在运行阶段直接进行代理,而在字节码文件中体现不出。

使用AspectJ加强静态代理

        AspectJ是早期AOP的实现方式,它通过独有的关键字aspect定义一个切面的代理文件,在结合Spring框架开发的项目中,已经很少会看到它的身影,但是在Spring框架的底层源码中,应用非常广泛。

//TODO

        作为一种设计模式,我们先来事


2019-08-09鱼鱼