第六講 靜态代理
1、靜态代理的角色分析:
抽象角色------一般使用接口或者抽象類來實作。
真實角色------被代理的角色 (租房子的人)
代理角色------代理真實角色--代理真實角色後一般會做一些附屬操作。 (中介租房,添加其他方法功能)
客戶------------使用代理角色來進行一些操作
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL0IjNzIjN4ITMx0CO4YTNzkTMzITNxgDM5EDMy0CNyQzM2QTMvwFOwkTMwIzLcRjM0MjN0EzLcd2bsJ2Lc12bj5ycn9Gbi52YugTMwIzZtl2Lc9CX6MHc0RHaiojIsJye.png)
2、代碼 略見/07spring4_staticproxy
3、使用靜态代理好處:
使得真實角色處理的業務更加純粹,不再去關注一些公共的事情。(公共的事情(切面)交由代理類去切入)
(1、dao接口的實作類需要有事務,但每一個實作類都加相同的不好,讓一個代理類去實作dao接口,然後在裡面添加事務代碼 2、service接口的實作類需要有日志,每一個方法都需要去加很麻煩,那麼就将它抽取出來)
公共的業務由代理來完成----實作了業務的分工
公共業務發生擴充時變得更加集中和友善
缺點: 類多了----多了代理類,工作量變大了,有一個service就必須要有一個代理類,開發效率降低了,是以靜态代理太不爽
現在又想有靜态代理的好處,又不想多寫類,就有了----動态代理
第七講 動态代理(動态代理指的是可以動态生成代理類,是以抽象角色和真實角色都應該存在)
1、動态代理和靜态代理的角色是一樣的。
2、動态代理的代理類是動态生成的,剛才靜态代理的代理類是提前寫好的。
3、分為兩類----基于接口動态代理和基于類的動态代理
a) 基于接口動态代理---jdk動态代理(下面學的)
b) 基于類的動态代理---cglib
現在javasist來生成動态代理。
4、jdk動态代理---了解Proxy類和invocationHandler接口
實作代碼:看代碼了解;
抽象角色
真實角色
代理角色
package cn.sxt.dynamicproxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
這個類是一個動态代理類,省去了靜态代理要寫很多類的麻煩,下面的private Object;對象已将其擴充的一般情況下
public class ProxyInvocationHandler implements InvocationHandler {
private Rent rent;
//由于它代理的可能是任何類型,不止Rent類型,是以增加一個Object target類型
private Object target; //目标對象----真實對象
public void setTarget(Object target) {
this.target = target;
}
public void setRent(Rent rent) {
this.rent = rent;
}
/**
* 生成代理類方法,這個方法也可以不寫在這個類中,寫在這友善
*/其實這個方法可以寫在外面的
public Object getProxy() {
return Proxy.newProxyInstance(this.getClass().getClassLoader(),
target.getClass().getInterfaces(), this);
// return Proxy.newProxyInstance(this.getClass().getClassLoader(),
// target.getClass().getInterfaces(), this);
}
/**
* proxy是生成的代理類
* * method是代理類的調用處理程式的方法對象
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
log(method.getName());
seeHouse();//放在這個方法執行的前邊
這裡方法.invoke(),target表示真實對象,現在對象沒有,是以在上面給它一個真實對象private Rent rent;
Object result = method.invoke(target,args);
這個才是核心方法,修給invoke()第一個參數(比如這裡給為cent)再修改上面方法的target.class
(改為cent.class)
就可以實作不同的對象調用
fare();//放在這個方法執行的後邊
returnpublic void log(String methodName) {
System.out.println("執行"+methodName+"方法");
}
//看房
private void seeHouse() {
System.out.println("帶房客看房");
}
//收中介費
private void fare() {
System.out.println("收取中介費");
}
}
用戶端
上面代碼了解了後,隻要我有接口,我就可以代理
一個動态代理一般代理某一類業務,一個動态代理可以代理多個類。
轉載于:https://www.cnblogs.com/djlindex/p/11361059.html