静态代理
由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。
1、接口interface: Count.java
package test.proxy;
/**
* 定义一个账户接口
*
* @author Administrator
*
*/
public interface Count {
// 查看账户方法
public void queryCount();
// 修改账户方法
public void updateCount();
}
2、接口实现类impl:CountImpl.java
package test.proxy;
/**
* 委托类(包含业务逻辑)
*
* @author Administrator
*
*/
public class CountImpl implements Count {
public void queryCount() {
System.out.println("queryCount 查看账户方法...");
}
public void updateCount() {
System.out.println("updateCount 修改账户方法...");
}
}
3、代理类:CountProxy.java
package test.proxy;
/**
* 这是一个代理类(增强CountImpl实现类)
*
* @author Administrator
*
*/
public class CountProxy implements Count {
private CountImpl countImpl;
/**
* 覆盖默认构造器
*
* @param countImpl
*/
public CountProxy(CountImpl countImpl) {
this.countImpl = countImpl;
}
public void queryCount() {
System.out.println("queryCount 事务处理之前");
// 调用委托类的方法;
countImpl.queryCount();
System.out.println("queryCount 事务处理之后");
}
public void updateCount() {
System.out.println("updateCount 事务处理之前");
// 调用委托类的方法;
countImpl.updateCount();
System.out.println("updateCount 事务处理之后");
}
}
4、测试类:TestCount.java
package test.proxy;
public class TestCount {
public static void main(String[] args) {
CountImpl countImpl = new CountImpl();
CountProxy countProxy = new CountProxy(countImpl);
countProxy.updateCount();
countProxy.queryCount();
}
}
执行结果:
updateCount 事务处理之前
updateCount 修改账户方法...
updateCount 事务处理之后
queryCount 事务处理之前
queryCount 查看账户方法...
queryCount 事务处理之后
观察代码可以发现每一个代理类只能为一个接口服务,这样一来程序开发中必然会产生过多的代理,而且,所有的代理操作除了调用的方法不一样之外,其他的操作都一样,则此时肯定是重复代码。解决这一问题最好的做法是可以通过一个代理类完成全部的代理功能,那么此时就必须使用动态代理完成。