Spring 代理的講解(靜態代理和動態代理)
阿新 • • 發佈:2019-01-05
1、靜態代理的角色分析:
抽象角色:一般使用介面或抽象類來實現 (租)
真實角色:被代理的角色 (房東)
代理角色:代理真實角色--代理真實角色後一般會做一些附屬操作 (代理)
客 戶:使用代理角色來進行一些操作
Rent.java抽象角色:
package spring.staticproxy;
public interface Rent {
public void rent();
}
Client.java客戶角色:package spring.staticproxy; public class Client { public static void main(String[] args) { Host host=new Host(); Proxy proxy=new Proxy(host); proxy.rent(); } }
Proxy.java代理角色:
Host.java真實角色:package spring.staticproxy; public class Proxy implements Rent { private Host host; public Proxy() { super(); } public Proxy(Host host) { super(); this.host = host; } public Host getHost() { return host; } public void setHost(Host host) { this.host = host; } // 租房: public void rent() { seeHouse(); host.rent(); fare(); } // 收費 private void fare() { System.out.println("收取中介費"); } // 看房 private void seeHouse() { System.out.println("帶房客看房"); } }
package spring.staticproxy;
public class Host implements Rent {
public void rent() {
System.out.println("房屋出租");
}
}
2、使用代理的好處
使真實角色處理的業務更加純粹,不再去關注一些公眾的東西() 公共的業務由代理來完成,實現業務分工 公共業務發生擴充套件時變得更加集中和方便缺點:
類多了,多了代理類,工作量變大3、動態代理
動態代理和靜態代理的角色是一樣的 動態代理的代理是動態生成的 分兩類:一類是基於介面動態代理 JDK動態代理4、JDK 動態代理 --- Proxy代理,InvocationHander介面
實現動態代理:
介面Rent.java
package spring.dynamicproxy;
public interface Rent {
public void rent();
}
Host.java
package spring.dynamicproxy;
public class Host implements Rent {
public void rent() {
// TODO Auto-generated method stub
System.out.println("房屋出租");
}
}
proxyInvocationHandler.java
package spring.dynamicproxy;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import org.springframework.cglib.proxy.InvocationHandler;
public class ProxyInvocationHandler implements InvocationHandler,
java.lang.reflect.InvocationHandler {
// private Object target;
// 生成setTarget()
private Rent rent;
public void setRent(Rent rent) {
this.rent = rent;
}
public Object getProxy() {
return Proxy.newProxyInstance(this.getClass().getClassLoader(), rent
.getClass().getInterfaces(), this);
}
// proxy是代理類method代理類的呼叫處理程式的方法
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
seeHouse();
Object result = method.invoke(rent, args);
fare();
return result;
}
private void fare() {
System.out.println("收取中介費");
}
// 看房
private void seeHouse() {
System.out.println("帶房客看房");
}
}
proxy是代理類,method是代理類呼叫處理程式的方法物件,
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
seeHouse();
Object result = method.invoke(rent, args);
fare();
return result;
}
public Object getProxy() {
return Proxy.newProxyInstance(this.getClass().getClassLoader(), rent
.getClass().getInterfaces(), this);
}
Client.java
package spring.dynamicproxy;
public class Client {
public static void main(String[] args) {
Host host = new Host();
ProxyInvocationHandler pih = new ProxyInvocationHandler();
pih.setRent(host);
Rent proxy = (Rent) pih.getProxy();
proxy.rent();
}
}