动态代理,有人说就像是上课点名,你在宿舍,你的舍友帮你答到,有人说就像是你有一个摊位要收租金,你的儿子帮你去收,你人没去,虽然我说不上动态代理到底是什么,但是当自己跟着写出来这个过程之后,会有一点明白的
1、首先创建一个接口
public interface Flyable {
void fly();
}
2、创建这个接口的实现类
public class Bird implements Flyable{
@Override
public void fly() {
System.out.println("Bird is flying...");
}
}
3、创建动态代理类
public class LoadHander implements InvocationHandler{
private Object obj;
public LoadHander(Object obj){
this.obj = obj;
}
@Override
public Object invoke(Object proxy, Method method, Object[] arg2)
throws Throwable {
System.out.println("invoke begin ......");
method.invoke(obj, arg2);
System.out.println("invoke end ......");
return null;
}
}
4、创建真正执行调用的接口(此处是基于spring boot项目进行创建的,上一篇既是,如果不想用基于spring boot的,那么直接写一个main方法调用就可以了)
@RequestMapping("/bird")
public void bird(){
System.out.println( "Hello World!" );
Flyable bird = new Bird();
LoadHander loadHander = new LoadHander(bird);
Flyable birdProx = (Flyable) Proxy.newProxyInstance(bird.getClass().getClassLoader(), bird.getClass().getInterfaces(),
loadHander);
birdProx.fly();
}
控制台调用,后端输出为
即动态代理中的method.invoke(obj, arg2); 这句是调用的我们的实现类,动态代理的好处就是,要做不同的操作,只要创建一个新的实现类就可以,而且调用的部分很多都是可以复用的,只要Flyable bird=new Bird(); 这句的实现类修改就完全可以了,这也就是动态代理相对于静态代理的优势所在
注:此为非spring boot的main方法调用
public class App {
public static void main(String[] args){
Flyable bird = new Bird();
LoadLander loadLander = new LoadLander(bird);
Flyable birdProx = (Flyable) Proxy.newProxyInstance(bird.getClass().getClassLoader(), bird.getClass().getInterfaces(), loadLander);
birdProx.fly();
}
}