静态代理和动态代理

一:什么是代理模式

1.定义:为其他对象提供一种代理以控制对这个对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。

2.例子:最开始接触JDBC操作数据库的时候,业务层每一个方法都需要做以下几件事

(1)打开数据库连接

(2)执行我们想要的操作

(3)关闭数据库连接

此时,我的核心业务是第(2)步,其余两步为辅助业务。当核心业务与辅助业务写在了一个方法中时。会出现以下问题:

①代码业务冗余

②开关数据库连接大量的重复

3.通过代理模式,我们可以抽取出核心业务与辅助业务

二:静态代理和动态代理

静态代理:一个代理只能服务于一种类型的对象,当有1000个业务时,需要1000个静态代理,不利于业务的扩展。

动态代理:一个代理类可以服务于所有的业务对象。

三:动态代理的实现

1.实现InvocationHandle接口,该接口所在位置为:java.lang.reflect.InvocationHandler

2.该接口中有一个方法Object invoke(Object proxy, Method method, Object[] args)

(1)Ojbect proxy:表示需要代理的对象

(2)Method method:表示要操作的方法

(3)Object[] args:method方法所需要传入的参数(可能没有为,null.也可能有多个)

3.代理类java.lang.reflect.Proxy(Proxy 提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类)

4.调用代理类中的方法

public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces, InvocationHandler h)throws IllegalArgumentException

参数:

(1)loader - 定义代理类的类加载器

(2)interfaces - 代理类要实现的接口列表

(3)h - 指派方法调用的调用处理程序

返回:一个带有代理类的指定调用处理程序的代理实例,它由指定的类加载器定义,并实现指定的接口

四:代码展示

五:总结

1. 动态代理和静态代理相比较,最大的好处就是接口中声明的所有的方法都被转移到一个集中的方法中去处理,就是invocke()方法.这样在接口中声明的方法比较多的情况下我们可以进行灵活处理,而不需要像静态代理那样每一个方法进行中转。

2. 动态代理只能代理接口,代理类都需要实现InvocationHandler类,实现invoke方法。该invoke方法就是调用被代理接口的所有方法时需要调用的,该invoke方法的返回值是被代理接口的一个实现类。