参考博客:
https://www.cnblogs.com/liuyun1995/p/8144628.html
https://www.cnblogs.com/liuyun1995/p/8157098.html
https://www.cnblogs.com/liuyun1995/p/8144676.html
https://www.cnblogs.com/liuyun1995/p/8144706.html
https://blog.csdn.net/wangqyoho/article/details/77584832
静态代理与动态代理
静态代理
代理接口:UserDao.java
public interface UserDao {
void save();
}
目标对象:UserDaoImpl.java
public class UserDaoImpl implements UserDao {
@Override
public void save() {
System.out.println("正在保存用户...");
}
}
代理对象:TransactionHandler.java
public class TransactionHandler implements UserDao {
//目标代理对象
private UserDao target;
//构造代理对象时传入目标对象
public TransactionHandler(UserDao target) {
this.target = target;
}
@Override
public void save() {
//调用目标方法前的处理
System.out.println("开启事务控制...");
//调用目标对象的方法
target.save();
//调用目标方法后的处理
System.out.println("关闭事务控制...");
}
}
测试
public class Main {
public static void main(String[] args) {
//新建目标对象
UserDaoImpl target = new UserDaoImpl();
//创建代理对象, 并使用接口对其进行引用
UserDao userDao = new TransactionHandler(target);
//针对接口进行调用
userDao.save();
}
}
动态代理
代理接口:Car.java
public interface Car {
void drive(String driverName, String carName) ;
}
目标对象:Audi.java
public class Audi implements Car {
@Override
public void drive(String driverName, String carName) {
System.err.println("Audi is driving... " + "driverName: " + driverName + ", carName" + carName);
}
}
代理对象:CarHandler
public class CarHandler implements InvocationHandler {
private Car car;
public CarHandler(Car car) {
this.car = car;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("before----");
method.invoke(car,args);
System.out.println("after-----");
return null;
}
}
测试
public class ProxyTest {
public static void main(String[] args) {
Car audi = (Car) Proxy.newProxyInstance(Car.class.getClassLoader(),new Class<?>[] {Car.class},new CarHandler(new Audi()));
audi.drive("name1","audi");
}
}
总结:
-
两者都是基于接口的代理
-
静态代理中代理类和接口类高度耦合 , 对于每个目标对象 , 都必须创建一个代理对象 ;或者一个代理对象实现了多个方法 , 但是会产生许多重复的逻辑
-
动态代理中代理对象实现了InvocationHandler接口 , 通过反射机制 , 动态代理在运行过程中为每个目标对象生成对应的代理类