Java代理之静态代理
Java静态代理包括两部分,第一部分是固有内容,第二部分是代理内容。固有内容包括接口和对应的实现类,代理内容是一个新增的类,它实现了固有的接口,即代理类和固有实现类实现的是同一个接口。
由于代理类需要调用固有实现类的方法,所以代理类需要拥有固有实现类的实例和注入这个实例的构造方法。
固有内容的代码如下:
package com.zaoren.proxy; /** * 固有接口 * @author thinkpad * */ public interface IUserDao { void save(); }
package com.zaoren.proxy; public class UserDao implements IUserDao { public void save() { System.out.println("------------保存user信息"); } }
代理内容的代码如下:
package com.zaoren.proxy; public class UserDaoProxy implements IUserDao { private IUserDao userDao; public UserDaoProxy(IUserDao userDao) { this.userDao = userDao; } public void save() { System.out.println("-----------调用目标对象前处理"); userDao.save(); System.out.println("-----------调用目标对象后处理"); } }
测试类的代码如下:
package com.zaoren.proxy; public class MainClass { public static void main(String[] args) { IUserDao userDao = new UserDao(); UserDaoProxy proxy = new UserDaoProxy(userDao); proxy.save(); } }
控制台输出结果为:
代理类最重要的特征是,要和被代理的类实现相同的接口。就像现实世界中的情况一样,无论你要找明星做任何事情,你都可以去找他的代理人。
静态代理有什么作用呢?网上的答案大多是可以扩展被代理的类的内容,但是我们不使用代理方式,直接将基础方法再封装一层,不也一样可以达到目的吗?我认为静态代理的主要作用在于,它代理了一个类的所有方法,而不仅仅是某一个方法。静态代理注重整体,比如一个实体类,它有增删改查四个基础方法,我们可以直接建立一个代理类,将这四个基础方法都进行代理,所有调用被代理类的方法,都将改为调用代理类对应的方法,这样整个代码结构将比原来的更佳简洁和谐,代码调用也更加自然易懂。
总结下来,就是三句话:注重整体、优化代码结构、增强代码可读性。