java中的动态代理(一)

    今天我们来学习java中的另一个重要的特性叫做动态代理。所谓动态代理是可以在java运行过程中动态的创建一个类去实现一个或多个接口,可以在不修改原有类代码的基础上动态的添加功能和方法。正是因为这个特性使动态代理被java的许多框架中被广泛的使用。

    在介绍动态代理之前我需要先介绍一下什么是静态代理。在设计模式那一章我曾经介绍过一种设计模式叫做代理模式。在代理模式中有一个公共的接口,代理对象和实际的对象都需要去实现这个接口。在代理对象中有一个成员属性变量指向实际对象并在代理对象的构造函数中初始化,在实现公共接口的方法中它转发给了实际的对象并打印了一些调用信息。

public class StaticProxyTest {

    static interface BaseService {
        void say();
    }

    static class RealService implements BaseService {
        @Override
        public void say() {
            System.out.println("i am realService!");
        }
    }

    static class ProxySerice implements BaseService {

        private BaseService realService;

        public ProxySerice(BaseService baseService) {
            this.realService = baseService;
        }

        @Override
        public void say() {
            System.out.println("say before");
            realService.say();
            System.out.println("say after");

        }
    }

    public static void main(String[] args) {
        BaseService realService = new RealService();
        BaseService ProxySerice = new ProxySerice(realService);
        ProxySerice.say();

    }

}

上面的代码实现了在不改变原有service的基础上添加了打印日志的功能,为了实现这个功能我们创建了一个ProxyService对象,它的代码是在程序里固定的所以被称为静态代理。

    由于静态代理需要为每一个类都创建一个代理对象,这个工作量太庞大了而且如果有新的切面需求也比较的不好扩展,所以在平时的开发中我们一般使用的是动态代理模式。