1. 程式人生 > >spring 03.動態代理

spring 03.動態代理

概述:
  動態代理是指動態的在記憶體中構建代理物件(需要我們制定要代理的目標物件實現的介面型別),即利用JDK的API生成指定介面的物件,也稱之為JDK代理或者介面代理。

動態代理的總結

優點:代理物件無需實現介面,免去了編寫很多代理類的煩惱,同時介面增加方法也無需再維護目標物件和代理物件,只需在事件處理器中新增對方法的判斷即可。

缺點:代理物件不需要實現介面,但是目標物件一定要實現介面,否則無法使用JDK動態代理。

實現方式:

第一步:增加maven依賴
pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>org.spring03</groupId> <artifactId>spring03_dynamic_proxy</artifactId> <version
>
0.0.1-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.5.RELEASE</version> </dependency> </dependencies> </project>

第二步:編寫Rent介面

package org.spring03;

/**
 * 房屋出租介面
 */
public interface Rent {
	void rent();
}

第三步:編寫Host
Host.java

package org.spring03;

/**
* 房東類
*/
public class Host implements Rent{
   public void rent() {
   	System.out.println("房主出租房屋!");
   }
}

第四步 編寫動態代理類

MyInovationHandler.java

package org.spring03;

import java.lang.reflect.Proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
 * 動態代理類 動態的在記憶體中生成代理類物件
 */
public class MyInovationHandler implements InvocationHandler {
	private Rent rent;
	public void setRent(Rent rent) {
		this.rent = rent;
	}
	/**
	 * 生成代理類 引數一:類載入器、物件即用哪個類載入器來載入這個代理類到 JVM 的方法區(當前的代理器類)
	 * 引數二:介面表明該代理類需要實現的介面(房東類) 引數三:是呼叫處理器類例項即 ProxyInovationHandler 的實現的例項物件
	 */
	public Object getProxy() {
		return Proxy.newProxyInstance(rent.getClass().getClassLoader(), // 和目標物件的類載入器保持一致
				rent.getClass().getInterfaces(), // 目標物件實現的介面,因為需要根據介面動態生成物件
				this);// InvocationHandler:事件處理器,即對目標物件方法的

	}
	
	/**
	 * proxy 是代理類 method 代理類的呼叫處理的方法
	 */
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println("房屋出租開始");
		Object result = method.invoke(rent, args);
		System.out.println("房屋出租結束");
		return result;
	}

}

第五步 編寫測試類
Test.java


package org.spring03;

public class Test {
	public static void main(String[] args) {
		Host host = new Host();
		MyInovationHandler pih = new MyInovationHandler();
		pih.setRent(host);
		Rent rent = (Rent) pih.getProxy();
		rent.rent();
	}
}

執行結果

房屋出租開始
房主出租房屋!
房屋出租結束