天天看點

二、靜、動态代理(9~10)~~~~

第六講  靜态代理

1、靜态代理的角色分析:

  抽象角色------一般使用接口或者抽象類來實作。

  真實角色------被代理的角色  (租房子的人)

  代理角色------代理真實角色--代理真實角色後一般會做一些附屬操作。  (中介租房,添加其他方法功能)

  客戶------------使用代理角色來進行一些操作

二、靜、動态代理(9~10)~~~~

2、代碼  略見/07spring4_staticproxy

3、使用靜态代理好處:

  使得真實角色處理的業務更加純粹,不再去關注一些公共的事情。(公共的事情(切面)交由代理類去切入)

  (1、dao接口的實作類需要有事務,但每一個實作類都加相同的不好,讓一個代理類去實作dao接口,然後在裡面添加事務代碼     2、service接口的實作類需要有日志,每一個方法都需要去加很麻煩,那麼就将它抽取出來)

  公共的業務由代理來完成----實作了業務的分工

  公共業務發生擴充時變得更加集中和友善

  缺點:  類多了----多了代理類,工作量變大了,有一個service就必須要有一個代理類,開發效率降低了,是以靜态代理太不爽

  現在又想有靜态代理的好處,又不想多寫類,就有了----動态代理

二、靜、動态代理(9~10)~~~~

第七講  動态代理(動态代理指的是可以動态生成代理類,是以抽象角色和真實角色都應該存在)

1、動态代理和靜态代理的角色是一樣的。

2、動态代理的代理類是動态生成的,剛才靜态代理的代理類是提前寫好的。

3、分為兩類----基于接口動态代理和基于類的動态代理

  a)  基于接口動态代理---jdk動态代理(下面學的)

  b)  基于類的動态代理---cglib

  現在javasist來生成動态代理。

4、jdk動态代理---了解Proxy類和invocationHandler接口

二、靜、動态代理(9~10)~~~~
二、靜、動态代理(9~10)~~~~
二、靜、動态代理(9~10)~~~~
二、靜、動态代理(9~10)~~~~

實作代碼:看代碼了解;

抽象角色

二、靜、動态代理(9~10)~~~~

真實角色

二、靜、動态代理(9~10)~~~~

代理角色

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("收取中介費");
    }
}      

用戶端

二、靜、動态代理(9~10)~~~~

上面代碼了解了後,隻要我有接口,我就可以代理

二、靜、動态代理(9~10)~~~~

  一個動态代理一般代理某一類業務,一個動态代理可以代理多個類。

轉載于:https://www.cnblogs.com/djlindex/p/11361059.html