Java Web 静态代理和动态代理

静态代理

概述

  • 在编译时已经将接口、被代理类、代理类确定下来的代理方式
    • 代理类持有被代理类的实例
    • 代理类和被代理类implements相同接口
  • 代理的好处
    • 可以对原类的方法进行加强

Demo

  • 接口
package Proxy;

/**
 * Person接口
 */
public interface Person {
    //上交班费
    void giveMoney();
}
  • 被代理类
package Proxy;

public class Student implements Person{
	private String name;
	public Student(String name){
		this.name = name;
	}

	@Override
	public void giveMoney(){
		System.out.println(name + "上交班费50$");
	}
}
  • 代理类
package Proxy;

/**
 * 学生代理类,保留了一个学生实体,这样就可以调用实体的方法
 */
public class StudentProxy implements Person{
	Student stu;

	public StudentProxy(Person stu){
		//只代理学生对象
		if(stu.getClass() == Student.class){
			this.stu = (Student) stu;
		}
	}

	//代理学生的交班费行为
	public void giveMoney(){
		//附加行为
		System.out.println("mio is in progress!");

		stu.giveMoney();
	}
}
  • 测试
package Proxy;

public class Main {
	public static void main(String[] args){
		Person s = new Student("mio");

		Person monitor = new StudentProxy(s);

		monitor.giveMoney();
	}
}

动态代理

概述

  • 在项目运行的时候创建一个代理对象,这种代理方式是动态代理
    • Proxy类 : Proxy.newProxyInstance()
    • Spring的cglib

Demo

  • 接口
package DynamicProxy;

public interface Car {
	void run();
	void stop();
}
  • 被代理类
package DynamicProxy;

public class SportsCar implements Car{
	@Override
	public void run() {
		System.out.println("Sports car runs");
	}

	@Override
	public void stop() {
		System.out.println("Sports car stops");
	}
}
  • 动态代理(使用匿名内部类)
package DynamicProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class Main {
	public static void main(String[] args){
		final SportsCar sc = new SportsCar();

		//sc.run();
		//sc.stop();

		Car SportsCarPro = (Car) Proxy.newProxyInstance(SportsCar.class.getClassLoader(), new Class[]{Car.class}, new InvocationHandler() {
			@Override
			public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
				//method.invoke(sc,null);
				if("run".equals(method.getName())){ //只加强特定的方法
					System.out.println("run faster");
				}
				return method.invoke(sc,null);
			}
		});

		SportsCarPro.run();
		SportsCarPro.stop();
	}
}
posted @ 2020-10-23 17:41  yifeichong  阅读(186)  评论(0编辑  收藏  举报